Mesaj göndermek veritabanı yazmasının parçası olunca: Spanner queues
Spanner queues provide native transactional messaging
Yapay zekâ agent’ları iade başlatmak, stok yönetmek ya da alt agent’lara iş devretmek gibi eylemler yapıyor. Bunun için durumu bir operasyonel veritabanında tutuyor, eylemleri ise ayrı bir mesajlaşma ya da olay kuyruğuna gönderiyor. İki sistemin ayrı işlem noktaları olduğu için tutarsızlık kaçınılmaz: durum güncellenir ama mesaj gitmez (agent karar verir ama eylem olmaz), ya da mesaj gider ama durum işlemi geri alınır (agent geçersiz duruma göre hareket eder). Çözüm olarak geliştiriciler outbox deseni, idempotency katmanları ve uzlaştırma işçileri yazmak zorunda kalıyor.
Google Spanner queues’u genel kullanıma açtı: mesaj oluşturmak, aynı işlemin içinde sıradan bir yazma. Durum değişikliği ve niyet edilen eylem birlikte kesinleşir ya da birlikte başarısız olur. Özellikler arasında mesajı hemen ya da ileri bir zamana planlama (geciken yeniden denemeler, SLA zamanlayıcıları), agent işçileri için akışlı SQL okuma ve kuyruk tablolarını standart SQL ile inceleyerek gözlemleme var. Garanti en az bir kez teslimat; yani tüketici tarafı yine idempotent yazılmalı.
Yazı agent senaryosuna odaklansa da kuyruğun yalnızca agent’lar için olmadığını da belirtiyor: etkinlik akışları ve canlı güncellemeler gibi klasik olay tabanlı mimarilerde de kullanılabilir.
Öne çıkanlar
- Veritabanı ve kuyruk ayrı sistemlerse ‘ikisi birden’ garantisi yoktur.
- Mesajı işlemin parçası yapmak, outbox desenini platform özelliğine çevirir.
- En az bir kez teslimat tüketicinin idempotent olmasını yine gerektirir.
- Kuyruğu SQL ile sorgulayabilmek, takılan işi bulmayı kolaylaştırır.
Neden önemli?
‘Dual write’ sorunu (iki sisteme ayrı yazmak) dağıtık sistemlerin klasik hatasıdır. Çözümü ya veritabanının içine kuyruk almak ya da outbox deseni uygulamaktır; her iki yaklaşım da aynı fikri paylaşır.
Sende karşılığı
Bunu Spring Boot’ta bugün transactional outbox ile uygulayabilirsin: iş verisini ve gönderilecek mesajı aynı Postgres işleminde outbox tablosuna yaz, ayrı bir işçi bu tabloyu okuyup mesajı gönderip satırı işaretlesin. Mobit’te bir doküman yüklendiğinde ‘indeksle’ işini bu yolla tetiklersen, yükleme kaydedilip indeksleme isteği kaybolmaz. Tüketici tarafında aynı mesajın iki kez gelme ihtimaline karşı bir message_id ile tekrarı yok say. Bu, mülakatlarda sık sorulan bir soru.
Sözlük
- transactional outbox işlemsel gönderi kutusu
- Mesajı iş verisiyle aynı işlemde bir tabloya yazıp ayrı bir süreçle iletme deseni.
- dual write çift yazma
- Aynı değişikliği iki ayrı sisteme ayrı ayrı yazmaya çalışmak; tutarsızlık riski taşır.
- at-least-once delivery en az bir kez teslimat
- Bir mesajın kaybolmaması ama ara sıra birden fazla kez iletilebilmesi.
- idempotency idempotans
- Aynı işlemin birden fazla kez uygulanmasının sonucu değiştirmemesi.