بیک اینڈ ٹیوٹوریلز میں موجود جال
ٹیوٹوریلز آپ کو ایک سادہ عمل دکھاتے ہیں۔ ایک webhook وصول کریں۔ ڈیٹا بیس کو اپ ڈیٹ کریں۔ 200 OK واپس کریں۔
آپ کا کوڈ ٹیسٹنگ میں کام کرتا ہے۔ آپ اسے production میں بھیج دیتے ہیں۔ پھر آپ اپنے ڈیٹا بیس میں ڈپلیکیٹ ریکارڈز دیکھتے ہیں۔ صارفین کو دو بار کریڈٹ مل جاتا ہے۔ ڈیٹا کی انٹریز جمع ہونا شروع ہو جاتی ہیں۔
ٹیوٹوریلز نیٹ ورک کی ناکامی کی حقیقت کو نظر انداز کر دیتے ہیں۔
مسئلہ: ناقابل اعتبار نیٹ ورکس نیٹ ورکس ناکام ہو جاتے ہیں۔ آپ کا سرور شاید ڈیٹا کو آہستہ پروسیس کرے۔ ایک DNS ایرر آپ کے 200 OK رسپانس کو بھیجنے والے تک پہنچنے سے روک سکتا ہے۔
جب کسی سروس کو آپ کی تصدیق نہیں ملتی، تو وہ دوبارہ کوشش (retry) کرتی ہے۔ وہ وہی webhook دوبارہ بھیجتی ہے۔ اگر آپ کا کوڈ ہر درخواست کو قبول کر لیتا ہے، تو آپ ڈپلیکیٹ ڈیٹا پیدا کر دیتے ہیں۔
حل: Idempotency Idempotency کا مطلب یہ ہے کہ متعدد ایک جیسی درخواستیں بھی بالکل ایک ہی درخواست کے برابر اثر ڈالیں۔
لفٹ کے بٹن کے بارے میں سوچیں۔ پانچویں منزل کے بٹن کو ایک بار دبانے سے لفٹ کو پتہ چل جاتا ہے کہ اسے کہاں جانا ہے۔ اسے دس بار دبانے سے لفٹ 50ویں منزل پر نہیں چلی جاتی۔ نتیجہ وہی رہتا ہے۔
آپ کے webhook کو بھی اسی بٹن کی طرح کام کرنا چاہیے۔
اسے کیسے ٹھیک کریں محفوظ webhooks بنانے کے لیے ان مراحل پر عمل کریں:
- ایونٹ کی منفرد (unique) ID تلاش کریں۔
- کچھ بھی کرنے سے پہلے اپنے ڈیٹا بیس میں اس ID کو چیک کریں۔
- اگر ID موجود ہے، تو رک جائیں۔ 200 OK واپس کریں تاکہ بھیجنے والا دوبارہ کوشش کرنا بند کر دے۔
- اگر ID نئی ہے، تو ڈیٹا کو پروسیس کریں۔
- ایونٹ کی ID کو فوری طور پر اپنے ڈیٹا بیس میں محفوظ کریں۔
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 کی وجہ سے ڈپلیکیٹ ڈیٹا کا سامنا کیا ہے؟ آپ Idempotency کو کیسے ہینڈل کرتے ہیں؟