İçeriğe geç
Muhammet Şafak
en
Soran: Selin Cevaplandı:

Laravel ve Go servisleri arasında mesaj şeması için Protobuf mu, JSON Schema mı?


Soru

Ana monolitim Laravel (PHP), veri işleme ve bildirim servislerim Go. Aralarında RabbitMQ ve Redis üzerinden yoğun asenkron mesajlaşma var. Go kesin tipli ama Laravel'de gevşek array'ler veri kaybına ve validasyon hatalarına yol açıyor. Dilden bağımsız, performanslı ve geriye uyumlu bir serialization standardı nasıl kurmalıyım — Protobuf mu, JSON Schema mı? Hataya açık noktalar neler?

Cevap

Kısa cevap: Asıl çözüm hangi wire format’ı seçtiğin değil, contract-first çalışman. Şemayı tek doğruluk kaynağı yapıp iki tarafı da ona zorlayınca sorun büyük ölçüde biter.

Yaşadığın sıkıntı format sorunu değil, sözleşme sorunu: Go tarafı tipi dayatıyor, PHP tarafı gevşek array’le “idare ediyor” ve veri tam sınırda kayboluyor.

  1. Protobuf: tip + performans + codegen istiyorsan bu. .proto dosyası tek doğruluk kaynağıdır; hem PHP hem Go için kod üretirsin, alan adlarını elle senkronlamazsın. Geriye uyumluluğun tek kuralı var: alan numaralarını asla yeniden numaralandırma veya geri kullanma; sadece yeni optional alan ekle. Binary olduğu için hafif ve hızlıdır.
  2. JSON Schema: JSON-native ve debug edilebilir kalmak istiyorsan bu. Mesaj insan-okur kalır, şemayı iki uçta da validate edersin. Operasyonu hafiftir ama garantisi zayıftır — kimse şemayı uygulamazsa yine eski noktaya düşersin. Yoğun trafik için Protobuf daha sağlam tercih.
  3. Asıl hata noktan gevşek PHP array’i. Mesajı uygulamanın derinliğinde değil, tam sınırda tipli bir DTO’ya validate edip deserialize et. Geçersizse oraya, kuyruğa girmeden reddet. Array’i app içine sızdırırsan hatayı 10 katman sonra yakalarsın.
  4. İsim ver: drift, optional/required ve zero-value tuzakları. Şema kayması (drift), optional ile required karışması, Go’da “boş değer” (0/"") ile “alan hiç yok” semantiğinin aynı görünmesi, versiyonsuz breaking change — hepsi klasik. Versiyonlamayı baştan kur.
  5. Para ve zamanı serileştirmede dikkat. Parayı float değil integer minor unit (kuruş) olarak taşı; zaman damgalarını RFC3339/UTC ver. Bu ikisi en sık sessizce bozulan alanlar.

Sonuç: Laravel↔Go yoğun asenkron trafikte ben olsam Protobuf + bir schema registry seçerdim — tipi gerçekten dayatır, codegen elle senkron derdini bitirir, performansı bedava gelir. JSON Schema’yı yalnızca trafiğin hafif ve insan-debug ihtiyacının yüksek olduğu yerde tut. Ama hangisini seçersen seç, kuralı değiştirme: gevşek array’i sınırda öldür, tipli DTO’ya çevir, breaking change’i versiyonla.

İlgili Yazılar

Etiketler: #mimari#mikroservis#go
Paylaş:

Yorumlar

Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.

Diğer Sorular

Tüm sorular

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi