Soat mintaqalari va sezgirlik
1) Bazaviy prinsiplar
UTC transport va saqlash sifatida. Barcha server taymstemplari va saralash kalitlari - UTC. Mahalliy «devor» vaqtiga aylantirish - chetida (edge/UI) yoki maxsus ajratilgan formatlash xizmatida.
’Europe/Kyiv’ ≠ siljish zonasi shunchaki’UTC + 02:00’emas: qoidalar vaqt o’tishi bilan o’zgaradi. IANA (tzdb) identifikatorlarini «+ 03:00» emas, balki foydalanuvchi/obʼekt profilida saqlang.
Soatni aniq farqlash.
Wall clock (inson vaqti, DST ta’sirida).
UTC clock (universal shkala).
Monotonic clock (davomiyliklar va taymautlarni oʻlchash uchun). Hech qachon vaqtni «devor» soatida hisoblamang.
Vaqt tebranishiga idempotentlik va bag’rikenglik. Tizimlar NTP/siljishning kichik sakrashlarini toʻgʻri boshdan kechirishi kerak.
2) Ma’lumotlar modeli va API-kontraktlar
Hodisalar:’occurred _ at’(UTC, RFC 3339),’timezone’(IANA), ixtiyoriy’wall _ time’(yaratish paytida siljishni saqlab qolgan holda lokal).
Davrlar: UTC’da’[start, end)’yarim yopiq oraliqlaridan foydalaning; oʻqiladigan jadvallar uchun boshlangʻich ifodani + zonani saqlang.
Takrorlanuvchi qoidalar: RRULE/cron ekvivalenti + IANA zonasi sifatida seriallashtiring. Rejalashtirish DSTni tushunadigan dvigatelni topshiring.
API vaqt formati: ISO 8601/RFC 3339 aniq’Z’yoki siljish bilan, masalan’2025-10-31T17: 00: 00Z’. «Suzuvchi» satrlarni siljitmasdan uzatmang.
Versionizatsiya: vaqtning biznes qoidalarini o’zgartirish (masalan, mamlakatning doimiy UTC + 1 ga o’tishi) - konfiguratsiyalar migratsiyasi va jadvallarni qayta hisoblash; sxemalarida hisobga oling.
3) Yozgi vaqt (DST): ambiguitetlar va o’tkazib yuborishlar
Takrorlangan lokal vaqtlar. Kuzda mahalliy «02:30» ikki marta sodir bo’lishi mumkin. Zonada rejalashtiruvchi’2025-10-26T02: 30 + 03’va’2025-10-26T02: 30 + 02’farqlashi kerak.
Oʻtkazib yuborilgan lokal vaqtlar. Bahorda daqiqalik oraliqlar «sakraydi» (masalan,’02: 00-03: 00’mavjud emas). Rejalashtiruvchi strategiyani belgilashi shart:’03:00’ga ko’chirish, o’tkazib yuborish yoki «imkon qadar tezroq» bajarish.
Tavsiya: vazifani «lokal qoida + zona» sifatida saqlang va amaldagi instansiyalarni oldindan UTC (rolling window) da materiallashtiring.
4) Leap seconds и time smear
Leap second. Qoʻshimcha soniya baʼzan UTCga kiritiladi. Aksariyat biznes jarayonlari 23:59:60 ni «koʻrmasligi» kerak.
Smear (moylash). Baʼzi muhitlar sakrashdan qochish uchun tuzatishni oynaga yumshoq tarzda (masalan, 12 soatdan ±) taqsimlaydi.
Amaliyot: butun klaster uchun yagona vaqt siyosatini (NTP/smir) muvofiqlashtiring, uni meta-ma’lumotlarga kiriting va runbook-da saqlang.
5) Rejalashtiruvchilar va cron-patternlar
«Oddiy cron» xavfi. Klassik cron DST va IANA zonalarini bilmaydi. Jadval zonaga bogʻlangan dvigatellardan foydalaning (Quartz-klass, bulutli Scheduler-servislar, Kubernetes CronJob).
Jadvallarni materiallashtirish. Ishonchli bo’lish uchun, keyingi N uchirishlarni UTCda (masalan, 7-30 kun) materiallashtiring, cursor saqlang va DSTda siyosatni aniqlang.
Vazifalarning idempotentligi. Ключ deduplication: `(job_id, scheduled_at_utc)`; qaytadan ishga tushirish nojo’ya ta’sirlarni takrorlamasligi kerak.
Soat sirpanishi. Uzoq tanaffuslar/hodisalar boʻlganda, catch-up yoki skip qilish haqida qaror qabul qiling. per-job moslamasini moslash.
6) Bayonnomalar va navbatlardagi vaqt
Hodisa shinalari (Kafka/Pulsar). ’event _ time’ va’ingest _ time’ni alohida saqlang. Retrospektiv qayta hisoblash uchun’event _ time’dan foydalaning.
Idempotent iste’molchilar. Takroriy yetkazib berishda partiyada harakatlanishga emas, balki voqea kalitiga va’event _ time’ga eʼtibor bering.
Saralash va oynalar. «Do’konning mahalliy vaqti bo’yicha 24 soat ichida» oynalarini muayyan zonaning mahalliy qoidalaridan olingan aniq sanadagi UTC oralig’i sifatida hisoblab chiqing.
7) Logi, trastirovka, metrika
Yagona taymzon standarti: UTCdagi barcha texnik loglar va metriklar (’Z’ko’rsatilgan holda). Dashbordda koʻrsatish - foydalanuvchi uchun lokalizatsiya qilingan.
Trace:’trace _ start _ utc’,’duration _ ms’ni monotonik soatlarda uzating. Hech qachon «devor» taymstamplarini chiqarib tashlamang.
Biznes hisobotlar: UTC bo’yicha emas, balki domen zonasida «kecha-kunduz» shakllantiring (masalan, Fransiya solig’i uchun «Europe/Paris»). Aniq hujjatlashtiring.
8) Foydalanuvchi profillari va kontenti
Профиль: `preferred_timezone` (IANA), `preferred_locale`, `currency`, `week_start` (Mon/Sun).
Multizon mohiyatlar: jamoalar/tashkilotlar uchun ishtirokchining shaxsiy zonasidan qat’i nazar, «domen zonasi» ni (masalan, do’kon/yuridik shaxs) saqlang.
Notifikatsiyalar: foydalanuvchi hududida «jim soatlar» ni hisoblab chiqing; DST xavfsizligi bilan UTC oynasidan jo’natish.
9) Anti-patternlar
Faqat lokal vaqtni siljitmasdan saqlash.
’+ hh: mm’ ni IANA identifikatori oʻrniga qattiq tikish.
Davomiylikni ikki «devor» taymstemplar farqidan hisoblash.
Zonalarni/DSTni qoʻllab-quvvatlamasdan cron boʻyicha rejalashtirish.
Normativ lokal zonani talab qilganda UTCda «kuniga» tahlil qilish.
Zona qoidalarining o’zgarmasligini taxmin qilish (mamlakatlar vaqt siyosatini o’zgartirmoqda).
10) Vaqtni sinovdan o’tkazish
Nazorat soatlari. Aniqlangan testlar uchun «soat» ni kodga (Clock/TimeProvider) kiriting.
Keys toʻplami:- Yozgi/qishki vaqtga o’tish (dubli/o’tkazib yuborish).
- Foydalanuvchini zonalar orasiga koʻchirish (’preferred _ timezone’almashtirish).
- Tzdb qoidalarini oʻzgartirish (bazani yangilash - regression testlar).
- NTP siljishi, kechiktirilgan hodisalar.
- Fazzi-testlar. Tasodifiy zonalar, sanalar, formatlar; etalon kutubxonasi bilan taqqoslash.
11) Kuzatish va foydalanish
Alertlar: NTPni sinxronlashtirish, tzdb yangilanishining orqada qolishi, DSTda «bajarilmagan» cron-vazifalar portlashi.
Dashbordlar: hodisalarni zonalar/lokal sutkalar bo’yicha taqsimlash; catch-up/skip hisoblagichlari.
Runbook: yurisdiksiyadagi vaqt qoidalarini o’zgartirishdagi tartib-qoidalar; tzdb yangilash tartibi; jadval egalari bilan muloqot qilish.
12) Sotish patternlari
Time Normalization Gateway. RFC 3339 UTC ga kiruvchi vaqtlarni normallashtiradigan, zonalarni valid qiladigan (IANA) va kontekstni to’ldiradigan nozik xizmat.
Local-Day Builder. DST’[start _ utc, end_utc)’ni hisobga olgan holda «mahalliy kun» va zonadan aniq UTC chegaralarini quradigan kutubxona/xizmat.
Schedule Materializer. Qoidalarni «lokal ifoda + zona» shaklida saqlaydigan rejalashtiruvchi UTCda kelajakdagi instansiyalarni materiallashtiradi va qarama-qarshiliklarni/ruxsatnomalarni boshqaradi.
Dual-Timestamp Events. ’occurred _ at _ utc’,’wall _ time _ local’,’timezone’. UI uchun lokal, tizimlar uchun UTC almashtiriladi.
13) Arxitektorning chek-varaqasi
1. UTC hamma joyda saqlanadimi?
2. IANA zonasi va domen ma’lumotlar siyosati mavjudmi?
3. Rejalashtiruvchi DSTni tushunadi va UTCdagi instansiyalarni materiallashtiradimi?
4. Logi/metrika - UTC; hisobotlar - domen zonasida?
5. Taymautlar/retrajlar - monotonik soatlarda?
6. Tzdb yangilanishi avtomatlashtirilgan va kuzatilyaptimi?
7. Testlar qoidalar o’zgarishini qoplaydimi?
14) Mini-retseptlar (psevdokod)
Lokal «ish kuni» ni UTC oraligʻiga aylantirish
function localDayToUtcInterval(dateLocal, tz):
startLocal = combine(dateLocal, 00:00) in tz endLocal = startLocal + 1 day startUtc = toUTC(startLocal) // учитывает DST endUtc = toUTC(endLocal)
return [startUtc, endUtc)
Takrorlanuvchi jadvalni materiallashtirish
inputs: rrule, tz, windowStartUtc, windowEndUtc for each localOccurrence in expand(rrule, tz, [windowStartUtc, windowEndUtc] projected to tz):
emit occurrence { scheduled_at_utc = toUTC(localOccurrence), tz }
Vazifani ishga tushirishning idempotent kaliti
dedupe_key = hash(job_id + scheduled_at_utc.toString())
15) Xavfsizlik va muvofiqlik
Audit: Foydalanuvchi da’volarini («Menga Lima vaqti bilan soat 23:00 gacha va’da qilingan») server xronologiyasi bilan kelishish uchun ikkala vaqt proyeksiyasini (UTC va mahalliy) saqlang.
Tartibga solish: hisobot davrlari talab etiladigan zonalarda (soliqlar, mas’uliyatli o’yin limitlari, «soatlar bo’yicha» marketing cheklovlari) shakllantiriladi.
Maxfiylik: vaqt mintaqasi - shaxsiy sozlamalar, lekin ma’lumotlarni aniq identifikatsiya qilmaydigan; umumiy maxfiylik siyosati doirasida ishlov bering.
Xulosa
«Vaqtga sezgirlik» - bu sana formati haqida emas, balki mas’uliyatning arxitektura chegaralari haqida: qayerda saqlash, qayerda o’zgartirish, qanday rejalashtirish va to’g’riligini qanday isbotlash haqida. UTC darajasidagi unifikatsiya, aniq IANA zonalari, malakali rejalashtiruvchilar, ikki marta taymstemplar va monotonik soatlar vaqtni hodisalar manbaidan infratuzilma xizmatiga aylantiradi.
«Arxitektura va Protokollar» bo’limining bog’liq moddalari (tavsiya etiladi):
- GeoDNS va geo-yo’naltirish; Yuklamani muvozanatlash; Hodisalarning vaqt davomida kuzatilishi; Cron-patternlar va jadvallarni materiallashtirish; Mintaqaviy cheklovlar va mahalliy hisobot sutkalari.