𝗠𝘆 𝗔𝗣𝗜 𝗕𝗿𝗼𝗸𝗲 𝗘𝘃𝗲𝗿𝘆 𝗝𝗮𝗻𝘂𝗮𝗿𝘆 𝟭𝘀𝘁
ನನ್ನ API ಪ್ರತಿ ಜನವರಿ 1 ರಂದು ಕೆಟ್ಟುಹೋಗುತ್ತಿತ್ತು.
ನನ್ನ API ಜನವರಿ 1 ರಂದು ಸರಿಯಾಗಿ 00:00 UTC ಸಮಯಕ್ಕೆ ಕೆಟ್ಟುಹೋಗಿತ್ತು.
ಇದು ಬಳಕೆದಾರರ ಮಧ್ಯರಾತ್ರಿಯಲ್ಲಿ ಕೆಟ್ಟುಹೋಗಲಿಲ್ಲ. ಇದು UTC ಮಧ್ಯರಾತ್ರಿಯಲ್ಲಿ ಕೆಟ್ಟುಹೋಗಿತ್ತು. ಟೋಕಿಯೊದ ಬಳಕೆದಾರರು ತಮ್ಮ ಸಮಯದ ಪ್ರಕಾರ ಬೆಳಿಗ್ಗೆ 9 ಗಂಟೆಯಿಂದ ದೋಷಪೂರಿತ ಡೇಟಾವನ್ನು ನೋಡಿದರು.
ಪರೀಕ್ಷೆಗಳು (tests) ಯಶಸ್ವಿಯಾದವು. ಸ್ಟೇಜಿಂಗ್ (staging) ಪರಿಸರವು ಸರಿಯಾಗಿ ಕೆಲಸ ಮಾಡಿತು. ಪ್ರೊಡಕ್ಷನ್ ಸರ್ವರ್ ಸ್ಟೇಜಿಂಗ್ಗಿಂತ ಭಿನ್ನವಾದ ಟೈಮ್ಜೋನ್ ಅನ್ನು ಬಳಸಿದ್ದರಿಂದ, ಈ ದೋಷವು ಕೇವಲ ಪ್ರೊಡಕ್ಷನ್ನಲ್ಲಿ ಮಾತ್ರ ಕಂಡುಬಂದಿತು.
ಸಮಸ್ಯೆ ಈ ಲಾಜಿಕ್ನಲ್ಲಿತ್ತು:
function getDailyReport(date) {
const start = new Date(date).toISOString().split('T')[0];
const end = new Date(start + 'T23:59:59Z');
return db.reports.findMany({
where: {
createdAt: { gte: new Date(start), lt: end }
}
});
}
ನೀವು ಸಮಯವಿಲ್ಲದೆ "2026-01-01" ನಂತಹ ದಿನಾಂಕವನ್ನು ನೀಡಿದಾಗ, ಸಿಸ್ಟಮ್ ಸ್ಥಳೀಯ ಟೈಮ್ಜೋನ್ ಅನ್ನು ಬಳಸುತ್ತದೆ.
ನಮ್ಮ ಸ್ಟೇಜಿಂಗ್ ಸರ್ವರ್ UTC ಅನ್ನು ಬಳಸುತ್ತಿತ್ತು. ನಮ್ಮ ಪ್ರೊಡಕ್ಷನ್ ಸರ್ವರ್ US-East ಅನ್ನು ಬಳಸುತ್ತಿತ್ತು. ಇದು ಪ್ರತಿಯೊಂದು ಡೇಟ್ ಕ್ವೆರಿಯಲ್ಲೂ ಐದು ಗಂಟೆಗಳ ವ್ಯತ್ಯಾಸವನ್ನು (offset) ಉಂಟುಮಾಡಿತು.
ಪ್ರತಿ ಕ್ವೆರಿಯಲ್ಲೂ ನಾವು ಐದು ಗಂಟೆಗಳ ಡೇಟಾವನ್ನು ಕಳೆದುಕೊಂಡೆವು. ಅಂಕಿಅಂಶಗಳು ಅಷ್ಟು ಹತ್ತಿರವಾಗಿದ್ದವು ಎಂದರೆ ಒಂದು ವರ್ಷದವರೆಗೆ ಯಾರೂ ಇದನ್ನು ಗಮನಿಸಲಿಲ್ಲ.
ಪರಿಹಾರ ಸರಳವಾಗಿತ್ತು. ಸ್ಟ್ರಿಂಗ್ಗೆ ಸಮಯವನ್ನು ಸೇರಿಸುವ ಮೂಲಕ UTC ಅನ್ನು ಕಡ್ಡಾಯಗೊಳಿಸಿ:
function getDailyReport(date: string) {
const start = new Date(`${date}T00:00:00Z`);
const end = new Date(`${date}T23:59:59.999Z`);
return db.reports.findMany({
where: {
createdAt: { gte: start, lt: end }
}
});
}
ಕೋಡ್ ಬದಲಾವಣೆಗೆ ಕೇವಲ ಸೆಕೆಂಡುಗಳು ಬೇಕಾದವು. ಆದರೆ ಸಿಸ್ಟಮ್ ಸರಿಪಡಿಸಲು ಒಂದು ವಾರ ಬೇಕಾಯಿತು. ನಾವು ಈ ನಾಲ್ಕು ಕೆಲಸಗಳನ್ನು ಮಾಡಿದೆವು:
• ಪರಿಸರವು UTC ಯಲ್ಲಿಯೇ ಇರುವುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು CI ನಲ್ಲಿ ಟೈಮ್ಜೋನ್ ಅಸರ್ಶನ್ (assertion) ಅನ್ನು ಸೇರಿಸಿದೆವು.
• ಪ್ರತಿಯೊಂದು ಕಂಟೇನರ್ ಅನ್ನು ಒಂದೇ ರೀತಿ ಇರಿಸಲು ಎಲ್ಲಾ Dockerfiles ನಲ್ಲಿ TZ=UTC ಎಂದು ಸೆಟ್ ಮಾಡಿದೆವು.
• ಡಿಪ್ಲಾಯ್ ಸ್ಕ್ರಿಪ್ಟ್ಗೆ (deploy script) ಟೈಮ್ಜೋನ್ ಚೆಕ್ ಅನ್ನು ಸೇರಿಸಿದೆವು.
• ಟೈಮ್ಜೋನ್ ಮಾಹಿತಿ ಇಲ್ಲದ ಯಾವುದೇ Date constructor ಅನ್ನು ಗುರುತಿಸಲು (flag) ಒಂದು ಲಿಂಟರ್ ರೂಲ್ (linter rule) ಬರೆದೆವು.
ಟೈಮ್ಜೋನ್ ಬಗ್ಗಳು ಅಪಾಯಕಾರಿ. ಅವು ನಿಮ್ಮ ಸಿಸ್ಟಮ್ ಅನ್ನು ಕ್ರ್ಯಾಶ್ ಮಾಡುವುದಿಲ್ಲ. ಅವು ಸರಿಯಾಗಿ ಕಾಣುವ ತಪ್ಪು ಡೇಟಾವನ್ನು ನೀಡುತ್ತವೆ. ನಿಮ್ಮ ಬಳಕೆದಾರರಿಗೆ ಎರರ್ ಪೇಜ್ ಕಾಣಿಸುವುದಿಲ್ಲ. ಅವರು ತಪ್ಪಾದ ಅಂಕಿಅಂಶಗಳನ್ನು ನೋಡುತ್ತಾರೆ ಮತ್ತು ಅವುಗಳನ್ನು ನಂಬುತ್ತಾರೆ.
ಈ ಮೂರು ನಿಯಮಗಳನ್ನು ಪಾಲಿಸಿ:
- ಸಿಸ್ಟಮ್ ಟೈಮ್ಜೋನ್ ಅನ್ನು ಎಂದಿಗೂ ನಂಬಬೇಡಿ. ಯಾವಾಗಲೂ
TZ=UTCಎಂದು ಸೆಟ್ ಮಾಡಿ. - ಟೈಮ್ಜೋನ್ ಇಲ್ಲದೆ ದಿನಾಂಕಗಳನ್ನು ಪಾರ್ಸ್ (parse) ಮಾಡಬೇಡಿ.
- ನಿಮ್ಮ CI ಟೈಮ್ಜೋನ್ ಪ್ರೊಡಕ್ಷನ್ನೊಂದಿಗೆ ಹೊಂದಿಕೆಯಾಗುತ್ತದೆ ಎಂದು ಎಂದಿಗೂ ಭಾವಿಸಬೇಡಿ.