𝗠𝘆 𝗔𝗣𝗜 𝗕𝗿𝗼𝗸𝗲 𝗘𝘃𝗲𝗿𝘆 𝗝𝗮𝗻𝘂𝗮𝗿𝘆 𝟭𝘀𝘁
મારી API ૧લી જાન્યુઆરીએ બરાબર 00:00 UTC સમયે બગડી ગઈ હતી.
તે વપરાશકર્તાઓની મધ્યરાત્રિએ બગડી નહોતી, પરંતુ UTC મધ્યરાત્રિએ બગડી હતી. ટોક્યોના વપરાશકર્તાઓએ તેમના સમય મુજબ સવારે 9 વાગ્યાથી ખોટો ડેટા જોયો.
ટેસ્ટ સફળ રહ્યા હતા. સ્ટેજિંગ (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 ને ફરજિયાત (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 માં ટાઈમઝોન એસરશન (assertion) ઉમેર્યું. • દરેક કન્ટેનર સમાન રાખવા માટે તમામ Dockerfiles માં TZ=UTC સેટ કર્યું. • ડિપ્લોય સ્ક્રિપ્ટમાં ટાઈમઝોન ચેક ઉમેર્યું. • ટાઈમઝોન માહિતી વગરના કોઈપણ Date constructor ને ઓળખવા માટે લિન્ટર (linter) રૂલ લખ્યો.
ટાઈમઝોન બગ્સ (bugs) જોખમી હોય છે. તેઓ તમારી સિસ્ટમને ક્રેશ કરતા નથી. તેઓ ખોટો ડેટા આપે છે જે સાચો દેખાય છે. તમારા વપરાશકર્તાઓને એરર પેજ દેખાશે નહીં. તેઓ ખોટા આંકડા જોશે અને તેમના પર વિશ્વાસ કરશે.
આ ત્રણ નિયમોનું પાલન કરો:
- સિસ્ટમ ટાઈમઝોન પર ક્યારેય વિશ્વાસ ન કરો. હંમેશા TZ=UTC સેટ કરો.
- ટાઈમઝોન વગર ક્યારેય તારીખો પાર્સ (parse) ન કરો.
- ક્યારેય એવું માની ન લો કે તમારો CI ટાઈમઝોન પ્રોડક્શન સાથે મેળ ખાય છે.