𝗠𝗲𝗿𝗶 API ਹਰ 1 ਜਨਵਰੀ ਨੂੰ ਖਰਾਬ ਹੋ ਜਾਂਦੀ ਸੀ
ਮੇਰੀ API 1 ਜਨਵਰੀ ਨੂੰ ਬਿਲਕੁਲ 00:00 UTC 'ਤੇ ਖਰਾਬ ਹੋ ਗਈ ਸੀ।
ਇਹ ਉਪਭੋਗਤਾਵਾਂ ਦੀ ਅੱਧੀ ਰਾਤ ਵੇਲੇ ਖਰਾਬ ਨਹੀਂ ਹੋਈ ਸੀ। ਇਹ UTC ਦੀ ਅੱਧੀ ਰਾਤ ਵੇਲੇ ਖਰਾਬ ਹੋਈ ਸੀ। ਟੋਕੀਓ ਦੇ ਉਪਭੋਗਤਾਵਾਂ ਨੇ ਆਪਣੇ ਸਮੇਂ ਅਨੁਸਾਰ ਸਵੇਰੇ 9 ਵਜੇ ਤੋਂ ਖਰਾਬ ਡੇਟਾ ਦੇਖਿਆ।
ਟੈਸਟ ਪਾਸ ਹੋ ਗਏ ਸਨ। ਸਟੇਜਿੰਗ (staging) ਮਾਹੌਲ ਸਹੀ ਕੰਮ ਕਰ ਰਿਹਾ ਸੀ। ਗਲਤੀ ਸਿਰਫ਼ ਪ੍ਰੋਡਕਸ਼ਨ (production) ਵਿੱਚ ਸੀ ਕਿਉਂਕਿ ਪ੍ਰੋਡਕਸ਼ਨ ਸਰਵਰ ਸਟੇਜਿੰਗ ਨਾਲੋਂ ਵੱਖਰਾ ਟਾਈਮਜ਼ੋਨ (timezone) ਵਰਤ ਰਿਹਾ ਸੀ।
ਸਮੱਸਿਆ ਇਸ ਲੌਜਿਕ (logic) ਵਿੱਚ ਸੀ:
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" ਵਰਗੀ ਤਾਰੀਖ ਪਾਸ ਕਰਦੇ ਹੋ, ਤਾਂ ਸਿਸਟਮ ਸਥਾਨਕ ਟਾਈਮਜ਼ੋਨ (local timezone) ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ।
ਸਾਡਾ ਸਟੇਜਿੰਗ ਸਰਵਰ UTC ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਸੀ। ਸਾਡਾ ਪ੍ਰੋਡਕਸ਼ਨ ਸਰਵਰ US-East ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਸੀ। ਇਸ ਨਾਲ ਹਰ ਇੱਕ ਡੇਟ ਕੁਐਰੀ (date query) 'ਤੇ ਪੰਜ ਘੰਟੇ ਦਾ ਅੰਤਰ (offset) ਪੈਦਾ ਹੋ ਗਿਆ।
ਅਸੀਂ ਹਰ ਕੁਐਰੀ 'ਤੇ ਪੰਜ ਘੰਟੇ ਦਾ ਡੇਟਾ ਗੁਆ ਦਿੱਤਾ। ਅੰਕ ਇੰਨੇ ਨੇੜੇ ਲੱਗ ਰਹੇ ਸਨ ਕਿ ਇੱਕ ਪੂਰੇ ਸਾਲ ਤੱਕ ਕਿਸੇ ਨੇ ਨੋਟ ਨਹੀਂ ਕੀਤਾ।
ਇਸਦਾ ਹੱਲ ਸਧਾਰਨ ਸੀ। ਸਟ੍ਰਿੰਗ (string) ਦੇ ਅੰਤ ਵਿੱਚ ਸਮਾਂ ਜੋੜ ਕੇ UTC ਨੂੰ ਫੋਰਸ (force) ਕਰੋ:
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 ਵਿੱਚ ਇੱਕ ਟਾਈਮਜ਼ੋਨ ਅਸਰਸ਼ਨ (timezone assertion) ਜੋੜਿਆ। • ਹਰ ਕੰਟੇਨਰ ਨੂੰ ਇੱਕੋ ਜਿਹਾ ਰੱਖਣ ਲਈ ਸਾਰੇ Dockerfiles ਵਿੱਚ TZ=UTC ਸੈੱਟ ਕੀਤਾ। • ਡਿਪਲਾਈ ਸਕ੍ਰਿਪਟ (deploy script) ਵਿੱਚ ਟਾਈਮਜ਼ੋਨ ਚੈੱਕ ਜੋੜਿਆ। • ਕਿਸੇ ਵੀ ਅਜਿਹੇ Date constructor ਨੂੰ ਫਲੈਗ ਕਰਨ ਲਈ ਇੱਕ linter ਨਿਯਮ ਲਿਖਿਆ ਜਿਸ ਵਿੱਚ ਟਾਈਮਜ਼ੋਨ ਜਾਣਕਾਰੀ ਦੀ ਕਮੀ ਸੀ।
ਟਾਈਮਜ਼ੋਨ ਬੱਗ (timezone bugs) ਖ਼ਤਰਨਾਕ ਹੁੰਦੇ ਹਨ। ਉਹ ਤੁਹਾਡੇ ਸਿਸਟਮ ਨੂੰ ਕ੍ਰੈਸ਼ ਨਹੀਂ ਕਰਦੇ। ਉਹ ਗਲਤ ਡੇਟਾ ਪੈਦਾ ਕਰਦੇ ਹਨ ਜੋ ਸਹੀ ਲੱਗਦਾ ਹੈ। ਤੁਹਾਡੇ ਉਪਭੋਗਤਾਵਾਂ ਨੂੰ ਕੋਈ ਐਰਰ ਪੇਜ (error page) ਨਹੀਂ ਦਿਖਾਈ ਦੇਵੇਗਾ। ਉਹ ਗਲਤ ਅੰਕ ਦੇਖਣਗੇ ਅਤੇ ਉਹਨਾਂ 'ਤੇ ਭਰੋਸਾ ਕਰਨਗੇ।
ਇਹਨਾਂ ਤਿੰਨ ਨਿਯਮਾਂ ਦੀ ਪਾਲਣਾ ਕਰੋ:
- ਸਿਸਟਮ ਟਾਈਮਜ਼ੋਨ 'ਤੇ ਕਦੇ ਵੀ ਭਰੋਸਾ ਨਾ ਕਰੋ। ਹਮੇਸ਼ਾ TZ=UTC ਸੈੱਟ ਕਰੋ।
- ਟਾਈਮਜ਼ੋਨ ਤੋਂ ਬਿਨਾਂ ਤਾਰੀਖਾਂ ਨੂੰ ਕਦੇ ਵੀ ਪਾਰਸ (parse) ਨਾ ਕਰੋ।
- ਕਦੇ ਵੀ ਇਹ ਮੰਨ ਕੇ ਨਾ ਚੱਲੋ ਕਿ ਤੁਹਾਡਾ CI ਟਾਈਮਜ਼ੋਨ ਪ੍ਰੋਡਕਸ਼ਨ ਨਾਲ ਮੇਲ ਖਾਂਦਾ ਹੈ।