Saat kəmərləri və həssaslıq
1) Əsas prinsiplər
UTC nəqliyyat və saxlama kimi. Bütün server vaxt tamponları və çeşidləmə açarları - UTC-də. Yerli «divar» vaxtına çevrilmə - kənarda (edge/UI) və ya xüsusi ayrılmış formatlaşdırma xidmətində.
≠ yerdəyişmə zonası. 'Europe/Kyiv' sadəcə 'UTC + 02:00' deyil: qaydalar zamanla dəyişir. IANA (tzdb) identifikatorlarını «+ 03:00» deyil, istifadəçi/obyekt profilində saxlayın.
Dəqiq saat fərqi.
Wall clock (insan vaxtı, DST məruz).
UTC saat (universal şkalası).
Monotonic clock (uzunluq və vaxt ölçmək üçün). Heç vaxt «divar» saatında vaxt hesablamayın.
Zaman titrəməsinə idempotentlik və dözümlülük. Sistemlər kiçik NTP/yerdəyişmə sıçrayışlarını düzgün yaşamalıdır.
2) Data modeli və API müqavilələri
Hadisələr: 'occurred _ at' (UTC, RFC 3339), 'timezone' (IANA), isteğe bağlı 'wall _ time' (yaradılarkən yerdəyişməni saxlayan yerli).
Dövrlər: UTC-də yarı qapalı '[start, end)' intervallarından istifadə edin; oxunan cədvəllər üçün orijinal ifadəni + zonanı saxlayın.
Təkrar qaydalar: RRULE/cron ekvivalenti + IANA zonası kimi seriallaşdırın. Planlaşdırma DST başa düşən mühərriki həvalə edin.
API-də vaxt formatı: açıq 'Z' və ya '2025-10-31T17: 00: 00Z' kimi yerdəyişmə ilə ISO 8601/RFC 3339. «Üzən» sətirləri yerdəyişmədən ötürməyin.
Version: zamanın biznes qaydalarının dəyişdirilməsi (məsələn, ölkənin daimi UTC + 1-ə keçməsi) konfiqurasiyaların miqrasiyası və cədvəllərin yenidən hesablanmasıdır; versiyaların sxemlərində nəzərə alın.
3) Yay vaxtı (DST): ambiguites və boşluqlar
Dublyaj yerli vaxt. Payızda yerli «02:30» iki dəfə baş verə bilər. Zonada planlaşdırıcı '2025-10-26T02: 30 + 03' və '2025-10-26T02: 30 + 02' fərqləndirməlidir.
Qaçırılan yerli vaxtlar. Yazda dəqiqə intervalları «sıçrayır» (məsələn, '02: 00-03: 00' yoxdur). Planlaşdırıcı strategiyanı müəyyən etməyə borcludur: '03:00', qaçırmaq və ya «mümkün qədər tez» yerinə yetirmək.
Tövsiyə: tapşırığı «yerli qayda + zona» kimi saxlayın və seçdiyiniz siyasəti DST-də düzəltməklə faktiki instansiyaları əvvəlcədən UTC-də (rolling window) materiallaşdırın.
4) Leap seconds и time smear
Leap second. Əlavə saniyə bəzən UTC-yə daxil edilir. Əksər iş prosesləri 23:59: 60-ı «görməməlidir».
Smear. Bəzi mühitlər sıçrayışdan qaçmaq üçün düzəlişləri pəncərəyə yumşaq şəkildə paylayır (məsələn, 12 saata ±).
Təcrübə: Bütün klaster üçün vahid vaxt siyasətini (NTP/smir) razılaşdırın, metadata daxil edin və runbook-da saxlayın.
5) Planlaşdırıcılar və cron nümunələri
«Sadə cron» təhlükəsi. Klassik cron DST və IANA zonalarını bilmir. Cədvəlin zonaya bağlı olduğu mühərriklərdən istifadə edin (Quartz-class, buludlu Scheduler xidmətləri, Kubernetes CronJob controller/admission vasitəsilə zona ilə).
Cədvəllərin materiallaşdırılması. Etibarlılıq üçün UTC-də növbəti N buraxılışlarını (məsələn, 7-30 gün) materiallaşdırın, cursor saxlayın və DST-də siyasəti müəyyənləşdirin.
Missiyaların idempotentliyi. Ключ deduplication: `(job_id, scheduled_at_utc)`; yenidən başlamaq yan təsirləri təkrarlamamalıdır.
Saat sürüşmə. Uzun fasilələr/hadisələr zamanı catch-up (buraxılmış) və ya skip etmək qərarına gəlin. per-job konfiqurasiya.
6) Protokollarda və növbələrdə vaxt
Hadisə şinləri (Kafka/Pulsar). Ayrıca 'event _ time' və 'ingest _ time' saxlayın. Retrospektiv yenidən hesablamalar üçün 'event _ time' istifadə edin.
İdempotent istehlakçılar. Yenidən çatdırıldıqda, partiyada yerdəyişmə deyil, hadisənin açarına və 'event _ time' diqqət yetirin.
Çeşidləmə və pəncərələr. «Mağazanın yerli vaxtı ilə 24 saat ərzində» pəncərələrini müəyyən bir tarixdə müəyyən bir zonanın yerli qaydalarından alınan UTC intervalları kimi hesablayın.
7) Qeydlər, izlər, metriklər
Vahid taymzon standartı: UTC-də bütün texniki qeydlər və metriklər ('Z' ilə). Dashboard ekran - istifadəçi üçün lokallaşdırılmış.
İzlər: monotonik saatlarda 'trace _ start _ utc', 'duration _ ms' verin. Heç vaxt «divar» timstampları çıxmayın.
Biznes hesabatları: UTC ilə deyil, domen zonasında «gün» formalaşdırın (məsələn, Fransa vergisi üçün «Europe/Paris»). Dəqiq sənədləşdirin.
8) Xüsusi profillər və məzmun
Профиль: `preferred_timezone` (IANA), `preferred_locale`, `currency`, `week_start` (Mon/Sun).
Multizon mahiyyətləri: komandalar/təşkilatlar üçün iştirakçının şəxsi zonasından asılı olmayaraq "domen zonası 'nı (məsələn, mağaza/hüquqi şəxs) saxlayın.
Qeydlər: istifadəçi zonasında «sakit saatlar» hesablayın; DST təhlükəsizliyi ilə UTC pəncərəsindən göndərin.
9) Anti-nümunələr
Yerdəyişmədən yalnız yerli vaxt saxlayın.
IANA identifikatoru əvəzinə '+ hh: mm' yerdəyişməsini sərt şəkildə tikmək.
İki «divar» zaman keçidinin fərqi ilə müddəti hesablayın.
Zonalar/DST dəstəyi olmadan cron planlayın.
Normativ yerli zona tələb etdikdə UTC-də «gündəlik» analitika edin.
Zona qaydalarının dəyişməzliyini güman etmək (ölkələr zaman siyasətini dəyişir).
10) Vaxt testi
Nəzarət olunan saat. Müəyyən edilmiş testlər üçün «saat» kodunu (Clock/TimeProvider) vurun.
Paketlər:- Yay/qış vaxtına keçid (dubllar/keçidlər).
- Zonalar arasında istifadəçi yerdəyişməsi ('preferred _ timezone' dəyişməsi).
- Tzdb qaydalarının dəyişdirilməsi (yeniləmə bazası - reqressiya testləri).
- NTP yerdəyişmə, gecikmiş hadisə çatdırılması.
- Fazzi testləri. Təsadüfi zonalar, tarixlər, formatlar; etalon kitabxanası ilə müqayisə.
11) Müşahidə və istismar
Alertlər: NTP-nin sinxronizasiyası, tzdb yeniləməsinin gecikməsi, DST-də «yerinə yetirilməmiş» cron vəzifələrinin sıçrayışları.
Daşbordlar: hadisələrin zonalar/yerli günlər üzrə paylanması; catch-up/skip sayğacları.
Runbook: yurisdiksiyada vaxt qaydalarını dəyişdirərkən prosedurlar; tzdb yeniləmə qaydası; cədvəl sahibləri ilə ünsiyyət.
12) Satış nümunələri
Time Normalization Gateway. RFC 3339 UTC-yə daxil olan vaxtları normallaşdıran, zonaları təsdiqləyən (IANA) və konteksti tamamlayan incə xidmət.
Local-Day Builder. «Yerli gün» və zonadan olan kitabxana/xidmət DST nəzərə alınmaqla dəqiq UTC sərhədlərini '[start _ utc, end_utc)' qurur.
Schedule Materializer. Qaydaları «lokal ifadə + zona» şəklində saxlayan planlaşdırıcı UTC-də gələcək instansiyaları materiallaşdırır və toqquşmaları/keçidləri idarə edir.
Dual-Timestamp Events. 'occurred _ at _ utc', 'wall _ time _ local', 'timezone' sahələri ilə hadisələr. UI üçün yerli, sistemlər üçün UTC.
13) Memarın yoxlama siyahısı
1. Hər yerdə UTC saxlanılır?
2. Varlıqların IANA zonası və domen məlumat siyasəti varmı?
3. Planlayıcı DST-ni başa düşür və UTC-də instansiyaları materiallaşdırır?
4. Log/metrika - UTC; hesabatlar - domen zonasında?
5. Vaxtlar/retrasiyalar - monotonik saatlarda?
6. tzdb yeniləmə avtomatlaşdırılmış və izlənilir?
7. Testlər qaydaların dəyişdirilməsini, dublları/dəqiqələrin buraxılmasını əhatə edir?
14) Mini reseptlər (psevdokod)
Yerli «iş günü» -ni UTC intervalına çevirmək
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)
Təkrarlanan cədvəlin materiallaşdırılması
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 }
İdempotent tapşırıq açarı
dedupe_key = hash(job_id + scheduled_at_utc.toString())
15) Təhlükəsizlik və uyğunluq
Audit: Hər iki vaxt proyeksiyasını (UTC və yerli) server xronologiyası ilə xüsusi iddiaları («mənə Lima 23: 00-a qədər vəd edildi») əlaqələndirmək üçün saxlayın.
Tənzimləyici: hesabat dövrləri tələb olunan zonalarda (vergilər, məsuliyyətli oyun limitləri, «saat üzrə» marketinq məhdudiyyətləri) formalaşır.
Gizlilik: saat qurşağı - fərdi parametrlər, lakin dəqiq müəyyən edilməyən məlumatlar; ümumi məxfilik siyasəti çərçivəsində emal edin.
Nəticə
«Zamana həssaslıq» tarix formatı haqqında deyil, məsuliyyətin memarlıq sərhədləri haqqında: harada saxlamaq, harada çevirmək, necə planlaşdırmaq və düzgünlüyü necə sübut etmək. UTC səviyyəsində unifikasiya, aydın IANA zonaları, səriştəli planlaşdırıcılar, ikiqat taymstamplar və monotonik saatlar zamanı hadisə mənbəyindən proqnozlaşdırıla bilən infrastruktur xidmətinə çevirir.
«Memarlıq və Protokollar» bölməsinin əlaqəli məqalələri (tövsiyə olunur):
- GeoDNS və geo-marşrutlaşdırma; Yükün balanslaşdırılması; Zaman hadisələrinin müşahidə edilməsi; Cron nümunələri və cədvəllərin materiallaşdırılması; Regional məhdudiyyətlər və yerli hesabat günləri.