İçeriğe geç
Çılgın Yazılım

Kurumsal Yazılım ve Entegrasyon kod örnekli

Veri Senkronizasyonu: Tek Yön mü, Çift Yön mü?

İki sistem arasında veri akıtmak kolay görünür; iş, aynı kaydın iki yerde birden değiştiği ana gelince başlar. Yön kararını baştan vermek, sonradan kurtarma betiği yazmaktan çok daha ucuz.

Çılgın Yazılım 4 dk okuma

Veri Senkronizasyonu: Tek Yön mü, Çift Yön mü?
İçindekiler
  1. Önce yön, sonra teknoloji
  2. Tek yön: varsayılan tercih
  3. Çift yön gerçekten gerekiyorsa
  4. Tetikleme: zamanlayıcı mı, olay mı?
  5. Aynı mesaj iki kez gelirse
  6. İzlenebilirlik olmadan bakım imkânsız
  7. Sonuç

Veri senkronizasyonu, kurumsal projelerde en çok küçümsenen iş kalemi. Talep genellikle tek cümleyle geliyor: "ERP'deki müşteri bilgileri CRM'de de görünsün." Tahmin bir hafta, gerçekleşen üç ay; aradaki farkın tamamı, ilk gün sorulmayan bir soruda gizli: aynı kayıt iki yerde birden değişirse ne olacak?

Tek yön ve çift yön senkronizasyon karşılaştırması
Çift yön, tek yönün iki katı değil; sorun sayısı olarak çok daha fazlasıdır.

Önce yön, sonra teknoloji

Hangi kuyruk, hangi format, hangi zamanlayıcı — bunların hepsi ikincil. Birincil karar şudur: her veri alanı için tek bir kaynak sistem (system of record) belirlenmiş midir?

Bu soru "hangi sistem daha önemli" diye sorulduğunda cevapsız kalır, ama alan bazında sorulduğunda kolayca cevaplanır:

AlanKaynak sistemYön
Müşteri unvanı, vergi noERPERP → CRM
Ürün fiyatıERPERP → mağaza
Görüşme notu, etkinlikCRMCRM → ERP (sadece okuma)
SiparişMağazaMağaza → ERP

Bu tablo doldurulduğunda, "çift yön" diye başlayan pek çok proje aslında birkaç tek yönlü akışa dönüşüyor. Bu, hem geliştirmesi hem hata ayıklaması kat kat kolay bir yapı.

Tek yön: varsayılan tercih

Tek yönlü akışta bir taraf yazar, diğer taraf okur. Hedef sistemde o alan salt okunur hâle getirilir; kullanıcı düzenlemeye çalıştığında "bu bilgi ERP'den gelir" uyarısı görür.

Bu kısıtlama teknik bir tembellik değil, kasıtlı bir tasarım. Alanı hedefte düzenlenebilir bırakırsanız kullanıcı er ya da geç düzenler, bir sonraki senkronizasyon değişikliği ezer ve kullanıcı sisteme güvenmeyi bırakır. "Yazdığım kayboluyor" şikâyetinin arkasında neredeyse her zaman bu vardır.

Çift yön gerçekten gerekiyorsa

Bazı durumlarda kaçınılmaz: saha ekibi mobil uygulamadan müşteri adresini güncelliyor, muhasebe aynı adresi ERP'den düzeltiyor. Böyle bir durumda üç şeyi baştan yazmanız gerekir.

1. Her kayıtta değişiklik damgası ve kaynak. Hangi sistemde, ne zaman değiştiğini bilmeden çakışmayı çözemezsiniz.

SQL
ALTER TABLE musteri
  ADD kaynak_sistem  VARCHAR(20)  NOT NULL DEFAULT 'yerel',
  ADD dis_id         VARCHAR(64)  NULL,
  ADD dis_surum      VARCHAR(64)  NULL,   -- karşı sistemin sürüm/etag değeri
  ADD son_senk_at    DATETIME     NULL,
  ADD UNIQUE KEY uq_dis (kaynak_sistem, dis_id);

2. Çakışma kuralı. "Son yazan kazanır" cazip ama tehlikelidir; iki sunucunun saati birkaç saniye kayıksa veya bir mesaj gecikirse eski veri yenisini ezer. Alan bazında sahiplik tanımlayabiliyorsanız en iyisi odur. Tanımlayamıyorsanız, çakışan kaydı otomatik çözmek yerine bir inceleme kuyruğuna almak çoğu kurumda daha az zarar veriyor — sessizce yanlış veri üretmektense birkaç kaydı insanın çözmesi tercih edilir.

3. Döngü koruması. Çift yönlü kurgunun klasik hatası: A'dan gelen değişiklik B'ye yazılır, B bunu kendi değişikliği sanıp A'ya geri gönderir, sonsuz döngü başlar. Çözüm, senkronizasyon kaynaklı yazma işlemlerini işaretleyip bu işaretli değişiklikler için olay yayınlamamaktır.

Tetikleme: zamanlayıcı mı, olay mı?

Karşı sistem olay yayınlayabiliyorsa (webhook) tercih edilecek yol budur: değişiklik anında akar, gecikme saniyelerle ölçülür. Webhook uçlarını tasarlarken düşülen tuzaklar için webhook tasarımı yazısına göz atın.

Olay yayınlanamıyorsa artımlı çekme yapın: "son senkronizasyondan sonra değişenleri ver". Tam kopyalama (full sync) günlük rutin olmamalı; yalnızca elle tetiklenen bir kurtarma yolu olarak dursun. Binlerce kaydı her gece baştan yazmak, hem karşı sistemi yorar hem de gerçek bir değişikliği fark etmenizi imkânsızlaştırır.

Aynı mesaj iki kez gelirse

Gelecektir. Ağ koptuğunda gönderen taraf tekrar dener, yanıtı alamadığı için aynı mesajı yeniden yollar. Alıcı taraf buna hazır değilse mükerrer kayıt üretir.

Çözüm, her mesaja benzersiz bir anahtar koymak ve alıcıda bu anahtarı kaydetmektir:

PHP
// Aynı olayı ikinci kez işleme
if ($this->islenmisOlaylar->where('olay_anahtari', $olay['id'])->countAllResults() > 0) {
    return $this->response->setStatusCode(200)->setJSON(['durum' => 'zaten_islendi']);
}

$this->db->transStart();
$this->musteriGuncelle($olay['veri']);
$this->islenmisOlaylar->insert(['olay_anahtari' => $olay['id'], 'islendi_at' => date('Y-m-d H:i:s')]);
$this->db->transComplete();

Dikkat: yinelenen mesaja hata değil, başarı dönün. Hata dönerseniz gönderen taraf tekrar dener ve sonsuz döngüye girersiniz. Dayanıklılık desenlerinin tamamı için üçüncü parti API entegrasyonunda dayanıklılık yazısı iyi bir başvuru.

İzlenebilirlik olmadan bakım imkânsız

Senkronizasyonun en çok zaman yiyen tarafı geliştirme değil, "bu müşteri neden güncellenmemiş" sorusuna cevap aramak. Bunu ucuzlatan tek şey kayıt tutmak: hangi kayıt, hangi yönde, ne zaman, hangi sonuçla işlendi. Bu kayıtları tutan ekipler soruyu dakikalar içinde kapatıyor; tutmayanlar her seferinde iki sistemi elle karşılaştırıyor. Nasıl kurgulanacağı için denetim izi yazısına bakabilirsiniz.

Silme işlemini asla senkronizasyona körlemesine dahil etmeyin. Karşı sistemdeki bir kaydın kaybolması, gerçekten silindiği anlamına gelmeyebilir — filtre değişmiş, yetki daralmış ya da API geçici olarak eksik dönmüş olabilir. Silmeyi pasifleştirme olarak uygulayın; gerçek silme insan onayına bağlı kalsın.

Sonuç

Veri senkronizasyonu projelerinde teknoloji seçimi nadiren belirleyicidir; belirleyici olan, ilk gün doldurulan o basit alan-yön tablosudur. Her alan için tek bir kaynak belirleyin, mümkün olan her yeri tek yöne indirin, çift yön kaçınılmazsa çakışma kuralını yazmadan koda başlamayın ve her mesajı tekrar gönderilebilir varsayın. Bu dört madde, üç aylık projeleri üç haftaya indiriyor. Entegrasyonun sözleşme tarafı için REST API tasarımı yazısı tamamlayıcı olacaktır.

Kurumsal entegrasyon desenlerinin klasik kaynağı: Enterprise Integration Patterns.

Beğeniniz benzer içerikleri öne çıkarmamıza yardımcı olur.

Sık sorulan sorular

Veri senkronizasyonu tek yön mü olmalı çift yön mü?

Mümkün olan her yerde tek yön. Çift yön, aynı kaydın iki sistemde de değiştirilebilmesi demektir ve bu, çakışma çözümü yazmayı zorunlu kılar. Pratikte çoğu ihtiyaç, alan bazında yön belirlenerek tek yöne indirgenebiliyor: fiyat ERP'den gelir, stok mağazadan gider.

Çakışma olduğunda hangi kayıt kazanmalı?

Kör bir "son yazan kazanır" kuralı veri kaybettirir, çünkü saatler senkron değildir ve gecikmiş bir mesaj yeni veriyi ezebilir. Daha sağlıklısı alan bazında sahiplik tanımlamak; bu mümkün değilse çakışan kaydı otomatik çözmek yerine bir kuyruğa alıp insana göstermek genelde daha az zarar veriyor.

Senkronizasyonu ne sıklıkta çalıştırmalı?

Sıklık yerine tetikleyiciyi sorgulayın. Kaynak sistem olay yayınlayabiliyorsa (webhook) değişiklik anında akıtın; yayınlayamıyorsa değişiklik damgasına göre artımlı çekin. Tam veri kopyalamayı yalnızca bir felaket kurtarma yolu olarak, elle tetiklenen bir iş olarak bırakın.

Aynı mesaj iki kez gelirse ne olur?

İyi tasarlanmış bir entegrasyonda hiçbir şey. Her mesajın benzersiz bir anahtarı olmalı ve alıcı taraf o anahtarı daha önce işlediyse sessizce yok saymalı. Bu özellik olmadan yeniden deneme mekanizması kurmak, mükerrer kayıt üretmenin en garantili yoludur.

Yazan

Çılgın Yazılım

Ben Evren Çılgın; yazılım geliştirme, web teknolojileri ve sistem tasarımı alanlarında uzmanlaşmış bir geliştiriciyim. Uzun yıllardır hem frontend hem de backend tarafında üretken, ölçeklenebilir ve kullanıcı dostu çözümler üretiyorum.

Hakkımızda Bize ulaşın

Bu konuda bir projeniz mi var?

İhtiyacınızı birkaç cümleyle anlatın; uygun yaklaşımı birlikte belirleyelim.

Projenizi Anlatın

İlgili yazılar

Yorumlar

Henüz yorum yok. Sorunuzu ya da deneyiminizi ilk siz yazın.

Yorum yazın

Yorumunuz onaylandıktan sonra yayınlanır. Ekibimiz gerekirse konuyla ilgili bir yanıt da paylaşır.

Yayınlanmaz; yalnızca gerektiğinde size ulaşmak için.

En az 10 karakter.

Tüm yazılar