Hangi somut problemi ele alıyoruz?

Üretim hattında farklı makinelerden gelen olayların zaman damgalarında tutarsızlıklar görülebilir: bir makine yerel saati 30 saniye önde, başka bir makine 2 dakika geride olabilir; bazı cihazlar kesinti sonrası eski saatle veriyi yeniden gönderir. Bu durum partilerin, arıza analizlerinin ve ERP entegrasyonunun yanlış sıralanmasına, stok/durum tutarsızlıklarına ve hatalı raporlamaya yol açar. Bu yazıda, üretim hattında makine saat uyumsuzluklarını ve zaman damgası hatalarını teknik olarak tespit edip düzeltmek için uygulanabilir adımlar sunuyorum. Daha geniş bağlamda bir üretim takip çözümü kurmayı düşünüyorsanız, ilgili hizmet detayları için Üretim Takip Hizmetimiz sayfasına bakabilirsiniz.

Tespit ve veri toplama: hangi veriyi kaydetmelisiniz?

Öncelikle hangi alanları zorunlu olarak topladığınıza karar verin. Her olay (event) için en az şunlar olmalı:

  • deviceId (cihaz/istasyon kimliği)
  • localTimestamp (cihazın kendi saatinde oluşturulan zaman damgası)
  • receivedUtc (sunucunun alım zamanı, UTC olarak otomatik atanmalı)
  • sequenceNo veya monotonicCounter (cihazın ürettiği ardışık sayı)
  • timezone veya tzOffset (cihazın bölgesel ayarı; mümkünse)
  • payload (sensör/veri içeriği)

Bu bilgileri saklamak, sonradan saat kaymalarını ölçmeyi ve düzeltmeyi mümkün kılar. Veri modelinizin bir örneği (alan isimleri), sunucu tarafında DateTimeOffset tipine eşlenecek şekilde olmalıdır. Ayrıca her mesaj için bir idempotencyKey veya mesajId tutmak duplicate kontrolünü kolaylaştırır.

Hızlı müdahale: hemen yapılması gerekenler

  • Cihazların işletim sistemi ve ağ ayarlarında NTP (Network Time Protocol) veya mümkünse PTP (Precision Time Protocol) etkinleştirin. NTP genel kullanım içindir; PTP daha hassas senkronizasyon gereken bantlarda tercih edilir.
  • Veri alım katmanında tüm zamanları UTC olarak kaydedin; cihazın localTimestamp alanını olduğu gibi saklayın ama ana sıralama UTC receivedUtc veya sequenceNo üzerinden yapılsın.
  • Her mesaja sequenceNo ekleyin; eğer cihaz desteklemiyorsa firmware tarafında monotonic sayaç eklenmesini planlayın. Sayaç yeniden başlatıldığında wrap/overflow davranışını tanımlayın.
  • Kritik üretim kararları için sadece cihaz saatine güvenmeyin; işlem onayı sunucu tarafında doğrulanana kadar bekleyin veya bir onay mekanizması kullanın.

Mimari desenler: veri girişi ve sıralama

Veri giriş hattı için önerilen mimari bileşenler ve davranışlar:

  • Edge katmanında hafif bir buffer (ör. SQLite) — cihaz çevrimdışıyken veriyi saklayıp bağlantı geldiğinde gönderir. Buffer, mesajın original zaman bilgilerini ve sequenceNo'yu bozmadan iletmelidir.
  • MQTT veya HTTP(S) ile ingest — mesaj sıralaması garanti etmiyorsa sequenceNo olmazsa yeniden sıralama gerekir. MQTT kullanılıyorsa QoS parametresini ve retain davranışını dikkatle seçin.
  • Mesaj kuyruğu (Kafka, RabbitMQ veya Azure IoT Hub) — sunucuya gelen veriyi kısa süreli tamponla ve iş sürecine göre sırala. Kuyruk tüketicilerinin yeniden başlatma sonrası idempotent olması önemlidir.
  • Sunucu tarafı işleme: idempotency key, sequenceNo kontrolü, zaman penceresi tabanlı yeniden sıralama. Gelen veriyi işlemeye başlamadan önce mantıksal olarak nasıl sıraya alacağınızı açıkça tanımlayın.

Zaman damgası sıralama stratejileri

  • Sequence-first: Cihaz sequenceNo veriyorsa en güvenli yöntem budur — DeviceId+SequenceNo ile kesin sıra sağlanır. Eksik sequence tespit mekanizması olmalı.
  • Receive-time with reorder window: Sequence yoksa sunucu, receivedUtc bazlı işler ancak kısa bir tampon (ör. 30-120s) kullanarak gelen gecikmeleri toparlar; tampon penceresi derinliği üretim hızı ve gecikme toleransına göre seçilir.
  • Hybrid: Hem sequenceNo hem receivedUtc kullanılarak; eksik veya çakışan sequence durumunda receivedUtc devreye girer. Örneğin aynı sequenceNo için receivedUtc farklıysa en düşük receivedUtc'yi tercih edebilirsiniz.

SQL Server tasarımı: hangi kolonlar, indeksleme ve partition önerileri?

Önerilen temel tablo kolonları:

  • Id (GUID/PK)
  • DeviceId (nvarchar)
  • SequenceNo (bigint, nullable)
  • LocalTimestamp (datetimeoffset)
  • ReceivedUtc (datetimeoffset default sysutcdatetime())
  • Payload (nvarchar(max) veya varbinary)
  • ProcessedFlag (bit)
  • CreatedAt (datetimeoffset default sysutcdatetime())

İndeks önerisi: DeviceId ve SequenceNo üzerine composite unique constraint koyun (WHERE SequenceNo IS NOT NULL şeklinde parti­al index mantığı olmasa da mantıksal kontrol sağlayın). Sorgu yükü yüksekse paritioning düşünün: DeviceId veya zaman periyoduna göre. ReceivedUtc için ek nonclustered indeks fayda sağlar; büyük tablolar için zamanlı partitioning performansı artırır.

ASP.NET Core tarafında pratik uygulama notları

  • API model validasyonu yapın: DeviceId, LocalTimestamp ve mümkünse SequenceNo zorunlu olsun. DateTimeOffset olarak bind edin ve gelen time zone bilgisini saklayın.
  • JSON serileştirmede DateTimeOffset formatını kullanın; ekleme sırasında gelen time zone bilgisini kaydedin.
  • İdempotent endpoint tasarlayın: aynı mesajın tekrar gönderilmesi durumunda duplicate insertleri engelleyin. Bunu DeviceId+SequenceNo veya idempotencyKey ile sağlayın.
  • Arka plan işlerinde (IHostedService) yeniden sıralama ve reconciliation işlemlerini yürütün; ağır işler HTTP isteği sırasında yapılmasın. IHostedService içinde per-device queue işleyen ve belirli aralıklarla reorder window'larını kapatan bir tüketici işlevi tasarlayın.
  • EF Core kullanıyorsanız composite index'i Fluent API ile tanımlayın ve migration'lar ile sunucuya uygulayın. Örneğin modelBuilder.Entity().HasIndex(e => new { e.DeviceId, e.SequenceNo }).IsUnique(false);

Senkronizasyon ve reconciliation algoritması (uygulanabilir örnek akış)

Aşağıda uygulanabilir, adım adım bir akış veriyorum. Bu akış üretim sürecinde güvenilir sırayı korumaya yönelik pratik kurallar içerir:

  • Alım: Her cihaz veri gönderirken sequenceNo ve localTimestamp koyar. Sunucu mesajı alır ve receivedUtc ile kaydeder.
  • Duplicate kontrol: Eğer aynı DeviceId+SequenceNo varsa duplicate olarak reddedilir veya ignored log kaydı yapılır.
  • Eksik sıra tespiti: Arka planda çalışan reconciliation servisi her device için en son işlenmiş sequence'i izler. Eğer gelen yeni kayıt sequence'de gap tespit ederse gap listesine alır.
  • Bekleme politikası: Eksik sequence için belirlenen pencereden (ör. örn. 5 dakika) küçükse beklenir; pencere dolunca event "missing" olarak işaretlenir ve iş akışı devam eder. Missing event'ler için manuel veya otomatik telafi (retry veya manuel güncelleme) süreci planlanmalıdır.
  • Onaylı iletme: ERP veya downstream sistemlere sadece sıra garantili ve processedFlag set edilmiş kayıtlar gönderilir. Toplu gönderimler öncesi bir batch-onay ekranı kullanıcıya tutarsızlıkları gösterir.

Offline cihazlar ve reconnect senaryoları

Çevrimdışı çalışan makineler için uygulama örneği:

  • Edge tarafında küçük bir kalıcı kuyruk (SQLite) tutun. Her kayıt original localTimestamp ve sequenceNo ile birlikte gönderilir.
  • Bağlantı geldiğinde mesajları original alanlarla sunucuya iletin. Sunucuda duplicate kontrolü ile idempotent şekilde kabul edilir; eksik paket kontrolü sunucuda yapılır.
  • Offline sürede cihazın RTC pili, firmware restart'ları ve sequence reset durumlarını loglayın; bu metadata reconciliation'da yardımcı olur.

Pratik SQL sorguları ve örnekler

Bir cihazın ortalama saat kaymasını görmek için bir mantık: fark = DATEDIFF(SECOND, SWITCHOFFSET(LocalTimestamp, '+00:00'), ReceivedUtc). Cihaz bazında ortalama ve standart sapmayı hesaplayarak drift alarmı kurabilirsiniz. Örnek sorgu mantığı anlatımı:

  • Cihaz bazında son 100 mesaj için ortalama drift: SELECT DeviceId, AVG(DATEDIFF(SECOND, SWITCHOFFSET(LocalTimestamp,'+00:00'), ReceivedUtc)) as AvgDrift FROM Events WHERE DeviceId = 'X' AND CreatedAt > DATEADD(day,-1,sysutcdatetime()) GROUP BY DeviceId;
  • Eksik sequence tespit mantığı: Window fonksiyonları ile lag ve lead kullanarak gaps bulunabilir: ROW_NUMBER/LEAD/LAG kombinasyonları gap analizi için uygundur.

Insert/Upsert için SQL Server'da MERGE kullanımı mantıksal örnektir; duplicate kontrolünü sunucu tarafında kısıtlamalar ve unique index ile destekleyin.

Alarm, telemetri ve otomatik düzeltme

  • Her cihaz için rolling window (örn. son 100 mesaj) içinde ortalama saat farkı ve sapmayı hesaplayın. Bu metrikleri telemetri sistemi ile toplayın.
  • Drift > eşik (ör. 30s gibi) ise: 1) cihaza NTP ayar gönderin, 2) gerektiğinde RTC yeniden senkronizasyon komutu veya reboot talep edin, 3) bakım talebi oluşturun. Otomatik eylemler uygulatmadan önce değişiklik yönetimi süreçlerini izleyin.
  • NTP spoofing ve güvenlik risklerine karşı NTP üzerinde authentication ve/veya PTP kullanımı değerlendirin. Cihaz erişiminde TLS/Mutual TLS ve ağ segmentasyonu önemlidir.

ERP entegrasyonu açısından dikkat edilecekler

ERP'ye üretim bilgisi gönderilirken zaman damgası ve sıra tutarlılığı kritiktir. ERP tarafına yalnızca sunucu onaylı ve sıra kontrolü geçmiş olayları göndermek en sağlıklısıdır. Arayüzte batch-onay süreci ekleyin: ERP'ye gönderilecek set öncesi tutarsız kayıtları raporlayın ve manuel/otomatik onay mekanizması ile aktarın. Bu, downstream işlemlerde tersine dönüşleri azaltır.

Operasyonel ipuçları ve göz önünde bulundurulması gerekenler

  • Daylight Saving Time ve timezone verilerini localTimestamp ile birlikte saklayın; DateTimeOffset bu konuda yardımcı olur. Sunucu tarafında tüm hesaplamaları UTC ile yapın.
  • Leap second durumları için sistem saat güncellemelerinde dikkatli olun; çoğu uygulama için NTP ile monotonik sayaç üzerine kurulu algoritma daha sağlam sonuç verir.
  • RTC pil ömrü, firmware güncellemeleri, restart olayları gibi operational metadata'yı merkezi loglara gönderin; bunlar drift kaynaklarını tespit etmede çok yardımcı olur.
  • Güvenlik: cihazlara gönderilen zaman ayarlarını doğrulayın; kötü niyetli NTP sunucularına karşı ağ bazlı koruma ve güvenli NTP sunucuları kullanın.

Uygulama Adımları - Kısa checklist

  • Edge cihazlarda NTP/PTP yapılandırması ve monotonic sequence numarası ekleyin.
  • API modelinizi DateTimeOffset ve sequenceNo ile güncelleyin, idempotency uygulayın.
  • SQL Server'da LocalTimestamp ve ReceivedUtc tutun; DeviceId+SequenceNo için unique constraint/indeks koyun.
  • Reorder buffer ve reconciliation süreçleri için arka plan servisleri yazın (IHostedService veya mesaj tabanlı tüketiciler).
  • Drift izleme ve otomatik uyarı/eylem mekanizmaları kurun; değişiklik yönetimini unutmayın.
  • ERP entegrasyonunda sadece doğrulanmış, sıra garantili veriyi kullanın.

Ne zaman dışarıdan destek düşünmelisiniz?

Eğer cihaz sayınız, farklı marka/model makine parkınızın heterojenliği veya üretim akışınızın gecikme toleransı yüksekse, bu entegrasyonlar mimari ve firmware düzeyinde düzenlemeler gerektirebilir. Böyle durumlarda, sorunun kök nedenine göre hem OT (Operational Technology) hem IT ekiplerinin birlikte çalışması gerekir. Konuyla ilgili daha detaylı bir teknik değerlendirme veya pilot uygulama için bizimle iletişime geçebilirsiniz: İletişim.

Sonuç

Makine saat uyumsuzlukları üretim verisinin güvenilirliğini doğrudan etkiler. Basit adımlar (NTP/PTP, UTC saklama, sequenceNo) ve sağlam bir ingest/reconciliation hattı ile bu sorunları büyük ölçüde azaltabilirsiniz. Yukarıdaki yöntemler hem kısa vadeli müdahaleler hem de uzun vadeli mimari kararlar için uygulanabilir yol haritası sunar. Uygulama notu olarak, her adımı canlı ortama almadan önce küçük bir pilot test önerilir; özellikle idempotency, gap handling ve otomatik düzeltme adımları dikkatle test edilmelidir.

Bu konuyu kendi işletmeniz için değerlendirelim.

Mevcut süreci ve kullandığınız sistemleri anlattığınızda uygulanabilir seçenekleri birlikte çıkarabiliriz.

Projenizi anlatın →