Platform entegrasyonu neden yerlerinde parçalanır (ve biz bunu nasıl düzelttik)
Getir, Trendyol ve Yemeksepeti'nin her birinin kendine özgü katalog davranışı var. Senkronizasyon motorumuzu sıfırdan yeniden yazdık; dağıtık eşleştirme konusunda öğrendiklerimizi paylaşıyoruz.
Entegrasyon demosunda her şey çalışır. Sorun, üçüncü ayda başlar: platformdaki bir ürün silinir, sizin tarafınızda durur; bir fiyat kampanyası bittiğinde eski fiyat geri gelmez; bir şube tatile girer ve dört platformdan üçünde hâlâ sipariş alır.
Kök neden: eşleştirmeyi kimlikle değil, isimle yapmak
İlk mimarimiz ürünleri isim benzerliğiyle eşleştiriyordu. Bu, %85 doğrulukla çalıştı — ve %15'lik hata payı, günde binlerce siparişte kabul edilemez bir rakam. Yeniden yazımın merkezinde, her platform için kalıcı bir dış kimlik (external ID) haritası tutmak vardı.
Üç platform, üç farklı gerçeklik modeli
- Bir platform kısmi güncelleme kabul ediyor; diğeri her seferinde tam katalog istiyor.
- Stok kapatma bir yerde ürün seviyesinde, başka yerde varyant seviyesinde çalışıyor.
- Kampanya fiyatı bir platformda ayrı bir alan, diğerinde ana fiyatın üzerine yazılıyor.
- Hata kodları standart değil; aynı durum üç farklı mesajla dönebiliyor.
Kuyruk, retry ve idempotency
Senkronizasyonu doğrudan HTTP çağrısı olarak yapmayı bıraktık. Her değişiklik artık bir olay olarak kuyruğa giriyor, işleyici idempotent çalışıyor ve başarısız iş üstel geri çekilmeyle yeniden deneniyor. Aynı olayın iki kez işlenmesi, sistemi bozmuyor — bu, dağıtık sistemde pazarlık edilemez bir özellik.
Gözlemlenebilirlik olmadan hiçbiri işe yaramaz
En büyük kazanç, motorun kendisi değil; her ürün için "şu an hangi platformda hangi durumdayım" sorusunu tek ekranda cevaplayabilmek oldu. Destek ekibinin çözüm süresi, bu ekran yayına girdikten sonra yarıya indi.
Dağıtık sistemde asıl özellik senkronizasyon değil, senkronizasyonun bozulduğunu fark edebilmektir.