Bağlam
Kripto para piyasası, 7/24 çalışan ve hata toleransının neredeyse sıfır olduğu bir ortamdır. Bu ortamda sembol verisinin doğruluğu, sistemin en kritik bileşenlerinden biridir.
HemenBasvur platformunda geliştirilen SymbolService, CoinGecko ve CoinAPI gibi dış sağlayıcılardan veri toplarken temel bir problemle karşı karşıyaydı:
Kesinti yaşamadan veri tutarlılığını nasıl garanti edebiliriz?
Problem
- Dış veri sağlayıcılarında yaşanan kesinti veya gecikmeler veri akışını bozabiliyordu
- Kısmi veya hatalı veri sistemde yayınlanma riski taşıyordu
- Yanlış veri finansal kayıplara neden olabilirdi
- Sistem hata anlarında güvenli davranacak şekilde tasarlanmamıştı
Kısıtlar
- Sistem dış API’lere bağımlıydı (CoinGecko, CoinAPI)
- Veri akışı kesintisiz olmalıydı
- Yanlış veri yayınlamak, hiç veri yayınlamamaktan daha büyük riskti
- Redis potansiyel bir single point of failure’dı
Kök Nedenler
- Veri güncelleme işlemleri atomik değildi
- Sistem dış bağımlılık kesintilerine karşı toleranslı değildi
- Cache katmanı (Redis) tekil hata noktasıydı
- Veri bütünlüğü yerine güncellik önceliklendiriliyordu
- Boş veri senaryoları için koruma yoktu
Temel Tasarım Kararları
A/B koleksiyon swap ile atomik veri geçişi sağlandı
Yeni veri aktif koleksiyon yerine ayrı bir koleksiyonda hazırlanıp tek adımda devreye alındı
Kirli okuma ve kısmi veri riski ortadan kaldırıldı
Empty Snapshot Guard uygulandı
Dış kaynaklardan boş veri gelirse sistem güncelleme yapmadı
Tüm veri setinin yanlışlıkla silinmesi engellendi
Dual Event (Fallback) stratejisi tasarlandı
Redis çalışıyorsa referans, çalışmıyorsa full payload gönderildi
Cache bağımlılığı nedeniyle veri akışının durması engellendi
Startup Health Check eklendi
Sistem başlarken aktif veri bütünlüğü doğrulandı
Tavizler
- Veri güncelliği bazı durumlarda bilinçli olarak geciktirildi
- Performans yerine doğruluk önceliklendirildi
- Redis fallback durumunda latency artışı kabul edildi
Hata Senaryoları
- Dış API boş veri dönerse sistem güncelleme yapmaz
- Redis çökmesi durumunda fallback event devreye girer
- Sistem fail fast yerine fail safe davranır
- Yanlış veri yaymak yerine eski veri korunur
Sonuçlar
- Kirli okuma ve kısmi veri riski ortadan kaldırıldı
- Sistem dış bağımlılık kesintilerinde çalışmaya devam etti
- Redis çökmesi durumunda veri akışı kesilmedi
- Yanlış veri yayınlama riski minimize edildi
- Sistem hata anlarında kontrollü çalışır hale geldi
Temel Çıkarım
- Dağıtık sistemlerde asıl problem performans değil, doğruluktur.
- Sistemler genellikle her şey yolundayken çalışacak şekilde tasarlanır. Oysa gerçek dayanıklılık, sistemin hata anında nasıl davrandığıyla belirlenir.
- Bu sistemde alınan en kritik karar, veriyi ne zaman güncellemek değil; gerektiğinde güncellememeyi seçmekti.