𝗧𝗵𝗲 𝗧𝗿𝗮𝗽 𝗜𝗻 𝗕𝗮𝗰𝗸𝗲𝗻𝗱 𝗧𝘂𝘁𝗼𝗿𝗶𝗮𝗹𝘀

ट्युटोरियल्स तुम्हाला एक सोपी प्रक्रिया दाखवतात. वेबहुक (webhook) प्राप्त करा. डेटाबेस अपडेट करा. 200 OK रिस्पॉन्स पाठवा.

तुमचा कोड टेस्टिंगमध्ये व्यवस्थित चालतो. तुम्ही तो प्रोडक्शनमध्ये पुश करता. त्यानंतर तुम्हाला तुमच्या डेटाबेसमध्ये डुप्लिकेट रेकॉर्ड्स दिसतात. युजर्सना दोनदा क्रेडिट मिळते. डेटा एन्ट्रीजचा ढीग साचतो.

ट्युटोरियल्स नेटवर्क फेल्युअरच्या (network failure) वास्तवाकडे दुर्लक्ष करतात.

समस्या: अविश्वसनीय नेटवर्क (Unreliable Networks) नेटवर्क फेल होऊ शकते. तुमचा सर्व्हर डेटा प्रोसेस करण्यास वेळ घेऊ शकतो. DNS एररमुळे तुमचा 200 OK रिस्पॉन्स पाठवणाऱ्यापर्यंत पोहोचण्यापासून रोखला जाऊ शकतो.

जेव्हा एखाद्या सर्विसला तुमचा कन्फर्मेशन मिळत नाही, तेव्हा ती पुन्हा प्रयत्न (retry) करते. ती तोच वेबहुक पुन्हा पाठवते. जर तुमचा कोड प्रत्येक रिक्वेस्ट स्वीकारत असेल, तर तुम्ही डुप्लिकेट डेटा तयार करता.

उपाय: आयडेम्पोटन्सी (Idempotency) आयडेम्पोटन्सी म्हणजे एकाच प्रकारच्या अनेक रिक्वेस्ट पाठवल्या तरी त्याचा परिणाम एकाच रिक्वेस्टसारखाच होणे.

लिफ्टच्या बटणाचे उदाहरण घ्या. ५ व्या मजल्याचे बटण एकदा दाबल्यास लिफ्टला कुठे जायचे ते समजते. ते बटण दहा वेळा दाबल्याने लिफ्ट ५० व्या मजल्यावर जात नाही. निकाल तोच राहतो.

तुमचा वेबहुक सुद्धा अशाच बटणासारखा काम केला पाहिजे.

हे कसे सुधारावे सुरक्षित वेबहुक्स तयार करण्यासाठी या पायऱ्या फॉलो करा:

  • इव्हेंटचा युनिक आयडी (unique ID) शोधा.
  • काहीही करण्यापूर्वी तुमच्या डेटाबेसमध्ये तो आयडी आहे का ते तपासा.
  • जर आयडी आधीच अस्तित्वात असेल, तर थांबवा. 200 OK रिस्पॉन्स पाठवा जेणेकरून पाठवणारा पुन्हा प्रयत्न करणे थांबवेल.
  • जर आयडी नवीन असेल, तर डेटा प्रोसेस करा.
  • इव्हेंट आयडी लगेच तुमच्या डेटाबेसमध्ये सेव्ह करा.

Example Logic in Node.js:

const eventId = req.body.event_id;

const existingEvent = await db.processedEvents.findUnique({
  where: { id: eventId }
});

if (existingEvent) {
  return res.status(200).send('Already processed');
}

await updateUserData(req.body.data);
await db.processedEvents.create({ data: { id: eventId } });

return res.status(200).send('Success');

आदर्श परिस्थितीसाठी सिस्टम बनवणे सोपे आहे. अपयशासाठी (failure) सिस्टम बनवणे हे खरे इंजिनिअरिंग आहे.

तुम्ही कधी रिट्रायमुळे (retries) निर्माण झालेल्या डुप्लिकेट डेटाचा सामना केला आहे का? तुम्ही आयडेम्पोटन्सी कशी हाताळता?

Source: https://dev.to/anubhavg23/the-hidden-trap-in-backend-tutorials-why-your-webhooks-are-creating-duplicate-data-and-how-to-fix-dba