𝗧𝗵𝗲 𝗧𝗿𝗮𝗽 𝗜𝗻 𝗕𝗮𝗰𝗸𝗲𝗻𝗱 𝗧𝘂𝘁𝗼𝗿𝗶𝗮𝗹𝘀
ట్యుటోరియల్స్ మీకు ఒక సరళమైన ప్రక్రియను చూపిస్తాయి. వెబ్హుక్ (webhook) స్వీకరించడం. డేటాబేస్ను అప్డేట్ చేయడం. 200 OKని తిరిగి పంపడం.
మీ కోడ్ టెస్టింగ్లో పనిచేస్తుంది. మీరు దానిని ప్రొడక్షన్లోకి పంపిస్తారు. అప్పుడు మీ డేటాబేస్లో డూప్లికేట్ రికార్డులను చూస్తారు. వినియోగదారులకు రెండుసార్లు క్రెడిట్ చేయబడుతుంది. డేటా ఎంట్రీలు పేరుకుపోతాయి.
నెట్వర్క్ వైఫల్యాల వాస్తవికతను ట్యుటోరియల్స్ విస్మరిస్తాయి.
The Problem: Unreliable Networks నెట్వర్క్లు విఫలమవుతాయి. మీ సర్వర్ డేటాను నెమ్మదిగా ప్రాసెస్ చేయవచ్చు. DNS ఎర్రర్ వల్ల మీ 200 OK రెస్పాన్స్ పంపిన వ్యక్తికి చేరకపోవచ్చు.
ఒక సర్వీస్కు మీ కన్ఫర్మేషన్ అందనప్పుడు, అది మళ్ళీ ప్రయత్నిస్తుంది (retry). అది అదే వెబ్హుక్ను మళ్ళీ పంపిస్తుంది. మీ కోడ్ ప్రతి రిక్వెస్ట్ను అంగీకరిస్తే, మీరు డూప్లికేట్లను సృష్టిస్తారు.
The Solution: Idempotency Idempotency అంటే ఒకే రకమైన బహుళ రిక్వెస్ట్లు పంపినా, అది ఒకే రిక్వెస్ట్ పంపినంత ప్రభావం కలిగి ఉండటం.
లిఫ్ట్ బటన్ను ఊహించుకోండి. 5వ అంతస్తు కోసం బటన్ను ఒకసారి నొక్కితే, లిఫ్ట్ ఎక్కడికి వెళ్లాలో తెలుస్తుంది. దానిని పదిసార్లు నొక్కితే, లిఫ్ట్ 50వ అంతస్తుకు వెళ్లదు. ఫలితం ఒకేలా ఉంటుంది.
మీ వెబ్హుక్ కూడా ఆ బటన్ లాగే పనిచేయాలి.
How to Fix It సురక్షితమైన వెబ్హుక్లను నిర్మించడానికి ఈ దశలను అనుసరించండి:
- ఈవెంట్ యొక్క యూనిక్ IDని కనుగొనండి.
- మీరు ఏదైనా చేసే ముందు ఆ ID కోసం మీ డేటాబేస్ను తనిఖీ చేయండి.
- ఒకవేళ ఆ ID ఇప్పటికే ఉంటే, ఆగిపోండి. పంపిన వ్యక్తి మళ్ళీ ప్రయత్నించడం ఆపడానికి 200 OKని తిరిగి పంపండి.
- ఒకవేళ ID కొత్తదైతే, డేటాను ప్రాసెస్ చేయండి.
- ఈవెంట్ IDని వెంటనే మీ డేటాబేస్లో సేవ్ చేయండి.
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');
పరిపూర్ణ పరిస్థితుల కోసం సిస్టమ్లను నిర్మించడం సులభం. వైఫల్యాలను ఎదుర్కోవడానికి సిస్టమ్లను నిర్మించడమే నిజమైన ఇంజనీరింగ్.
రిట్రైల వల్ల వచ్చిన డూప్లికేట్ డేటాతో మీరు ఎప్పుడైనా ఎదుర్కొన్నారా? మీరు Idempotencyని ఎలా హ్యాండిల్ చేస్తారు?