ಬ್ಯಾಕೆಂಡ್ ಟ್ಯುಟೋರಿಯಲ್ಗಳಲ್ಲಿನ ಬಲೆ
ಟ್ಯುಟೋರಿಯಲ್ಗಳು ನಿಮಗೆ ಒಂದು ಸರಳ ಪ್ರಕ್ರಿಯೆಯನ್ನು ತೋರಿಸುತ್ತವೆ. ಒಂದು ವೆಬ್ಹೂಕ್ (webhook) ಸ್ವೀಕರಿಸಿ. ಡೇಟಾಬೇಸ್ ಅಪ್ಡೇಟ್ ಮಾಡಿ. 200 OK ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ನೀಡಿ.
ನಿಮ್ಮ ಕೋಡ್ ಟೆಸ್ಟಿಂಗ್ನಲ್ಲಿ ಕೆಲಸ ಮಾಡುತ್ತದೆ. ನೀವು ಅದನ್ನು ಪ್ರೊಡಕ್ಷನ್ಗೆ (production) ಕಳುಹಿಸುತ್ತೀರಿ. ನಂತರ ನಿಮ್ಮ ಡೇಟಾಬೇಸ್ನಲ್ಲಿ ಡ್ಯೂಪ್ಲಿಕೇಟ್ (duplicate) ದಾಖಲೆಗಳನ್ನು ನೀವು ನೋಡುತ್ತೀರಿ. ಬಳಕೆದಾರರ ಖಾತೆಗೆ ಎರಡು ಬಾರಿ ಹಣ ಜಮೆಯಾಗುತ್ತದೆ. ಡೇಟಾ ಎಂಟ್ರಿಗಳು ರಾಶಿಬಿದ್ದಂತೆ ಆಗುತ್ತವೆ.
ನೆಟ್ವರ್ಕ್ ವೈಫಲ್ಯದ ವಾಸ್ತವವನ್ನು ಟ್ಯುಟೋರಿಯಲ್ಗಳು ನಿರ್ಲಕ್ಷಿಸುತ್ತವೆ.
ಸಮಸ್ಯೆ: ಅನಿಶ್ಚಿತ ನೆಟ್ವರ್ಕ್ಗಳು (Unreliable Networks) ನೆಟ್ವರ್ಕ್ಗಳು ವಿಫಲವಾಗುತ್ತವೆ. ನಿಮ್ಮ ಸರ್ವರ್ ಡೇಟಾವನ್ನು ನಿಧಾನವಾಗಿ ಪ್ರೊಸೆಸ್ ಮಾಡಬಹುದು. ಒಂದು DNS ದೋಷವು ನಿಮ್ಮ 200 OK ಪ್ರತಿಕ್ರಿಯೆಯು ಕಳುಹಿಸುವವನಿಗೆ ತಲುಪದಂತೆ ತಡೆಯಬಹುದು.
ಒಂದು ಸೇವೆಯು (service) ನಿಮ್ಮ ಖಚಿತಪಡಿಸುವಿಕೆಯನ್ನು ಪಡೆಯದಿದ್ದಾಗ, ಅದು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸುತ್ತದೆ (retry). ಅದು ಅದೇ ವೆಬ್ಹೂಕ್ ಅನ್ನು ಮತ್ತೆ ಕಳುಹಿಸುತ್ತದೆ. ನಿಮ್ಮ ಕೋಡ್ ಪ್ರತಿಯೊಂದು ವಿನಂತಿಯನ್ನು (request) ಸ್ವೀಕರಿಸಿದರೆ, ನೀವು ಡ್ಯೂಪ್ಲಿಕೇಟ್ಗಳನ್ನು ಸೃಷ್ಟಿಸುತ್ತೀರಿ.
ಪರಿಹಾರ: ಐಡೆಂಪೊಟೆನ್ಸಿ (Idempotency) ಐಡೆಂಪೊಟೆನ್ಸಿ ಎಂದರೆ ಒಂದೇ ರೀತಿಯ ಅನೇಕ ವಿನಂತಿಗಳನ್ನು ಮಾಡುವುದು ಒಂದು ವಿನಂತಿಯಷ್ಟೇ ಪರಿಣಾಮವನ್ನು ಬೀರುವಂತೆ ಮಾಡುವುದು ಎಂದರ್ಥ.
ಲಿಫ್ಟ್ ಬಟನ್ ಅನ್ನು ನೆನಪಿಸಿಕೊಳ್ಳಿ. 5 ನೇ ಮಹಡಿಯ ಬಟನ್ ಅನ್ನು ಒಮ್ಮೆ ಒತ್ತಿದರೆ ಲಿಫ್ಟ್ ಎಲ್ಲಿಗೆ ಹೋಗಬೇಕು ಎಂದು ತಿಳಿಯುತ್ತದೆ. ಅದನ್ನು ಹತ್ತು ಬಾರಿ ಒತ್ತಿದರೂ ಲಿಫ್ಟ್ 50 ನೇ ಮಹಡಿಗೆ ಹೋಗುವುದಿಲ್ಲ. ಫಲಿತಾಂಶವು ಒಂದೇ ಆಗಿರುತ್ತದೆ.
ನಿಮ್ಮ ವೆಬ್ಹೂಕ್ ಕೂಡ ಅಂತಹ ಬಟನ್ನಂತೆ ಕಾರ್ಯನಿರ್ವಹಿಸಬೇಕು.
ಇದನ್ನು ಸರಿಪಡಿಸುವುದು ಹೇಗೆ ಸುರಕ್ಷಿತ ವೆಬ್ಹೂಕ್ಗಳನ್ನು ನಿರ್ಮಿಸಲು ಈ ಹಂತಗಳನ್ನು ಅನುಸರಿಸಿ:
- ಘಟನೆಯ (event) ವಿಶಿಷ್ಟ 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');
ಪರಿಪೂರ್ಣ ಪರಿಸ್ಥಿತಿಗಳಿಗಾಗಿ ಸಿಸ್ಟಮ್ಗಳನ್ನು ನಿರ್ಮಿಸುವುದು ಸುಲಭ. ವೈಫಲ್ಯಗಳಿಗಾಗಿ ಸಿಸ್ಟಮ್ಗಳನ್ನು ನಿರ್ಮಿಸುವುದು ನಿಜವಾದ ಎಂಜಿನಿಯರಿಂಗ್.
ನೀವು ರಿಟ್ರೈಗಳಿಂದ (retries) ಉಂಟಾಗುವ ಡ್ಯೂಪ್ಲಿಕೇಟ್ ಡೇಟಾವನ್ನು ಎದುರಿಸಿದ್ದೀರಾ? ನೀವು ಐಡೆಂಪೊಟೆನ್ಸಿಯನ್ನು ಹೇಗೆ ನಿರ್ವಹಿಸುತ್ತೀರಿ?