# Aynı kuyruğu iki dilin serileştirme kilidine takılmadan paylaşması

> Dile özgü serileştirme yerine dondurulmuş bir JSON zarfı; polyglot kuyruk standardı BabelQueue'ya dönüştü.

- Şu an ne yapıyor: Dondurulmuş JSON zarfı dört dilde — PHP, Python, Go, Node.js — aynı baytları okutuyor; sidecar ya da broker eklentisi gerekmiyor. Polyglot kuyruk kuran ekipler spesifikasyonu ve SDK'ları bugün kullanabilir.
- Tür: Açık kaynak
- Durum: Ürün oldu
- Odak: Dağıtık sistem & mesajlaşma
- Başlangıç: 2026-03-01
- Labs’tan çıkış: 2026-06-15
- Teknolojiler: JSON, Redis, RabbitMQ, PHP, Python, Go, Node.js
- Etiketler: #kuyruk, #protokol, #polyglot
- Kaynak kodu: https://github.com/BabelQueue
- Web sitesi: https://babelqueue.com
- Bu iş ürüne dönüştü: BabelQueue (https://www.muhammetsafak.com.tr/portfolyo/babelqueue/)
- Bu işin arkasındaki araştırmalar: Partial index on beş dakikada üç yüz seksen kat şişti — ve autovacuum bir kez bile gelmedi (https://www.muhammetsafak.com.tr/research/kuyruk-tablosunda-bloat-ve-autovacuum/) · Partial index kuyruk tablosunu kırk bir kat küçültüyor — planner onu seçtiği sürece (https://www.muhammetsafak.com.tr/research/partial-index-kuyruk-tablosu/) · Postgres partial index'i generic plana çevirmedi: kırk çalıştırma, kırk custom plan (https://www.muhammetsafak.com.tr/research/planner-generic-plana-ne-zaman-geciyor/)
- Kaynak: https://www.muhammetsafak.com.tr/labs/babelqueue-lab/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
PHP'nin `serialize()`'ı ile Python'un `pickle`'ı aynı işi yapar; birbirlerinin ürettiği
baytları okuyamazlar. Sorun formatın kendisinde değil, formatın bir dile
ait olmasında — ve kuyruk, iki ucunda farklı diller duran ilk yer.

## Dile hapsolmuş bayt

Polyglot mimaride sinsi olan şu: bir servis kuyruğa kendi dilinin formatıyla
yazıyor, başka bir dildeki tüketici o baytları açamıyor. Mesaja gömülen dile
özgü tip bilgisi işi üreten dilin içine hapsediyor.

Denenen şey, araya sidecar ya da broker eklentisi koymadan, her dilin standart
kütüphanesiyle ayrıştırabildiği tek bir zarf tanımlamaktı. Zarf iş kimliğini,
dağıtık izleme için `trace_id`'yi, veri yükünü, metadata'yı ve deneme sayısını
taşıyor.

## Dondurulmuş zarf

Katı bir JSON zarfı — `schema_version` 1'de dondurulmuş — ve bu zarfın Redis ile
RabbitMQ üzerinde çalışan referans uygulaması. Ölçüm hedefi ek yükün %2'nin
altında kalmasıydı; sözleşme "bir dil üretir, başka bir dil tüketir, aynı
baytlar" ilkesine göre yazıldı.

## Kimliği sınıf adından ayırmak

İki karar zarfın biçiminden daha çok belirledi.

**İş kimliği sınıf adı değil, URN tabanlı kararlı bir tanımlayıcı.** Kuyruğa
yazılan işin "ne olduğunu" söylemenin en kolay yolu sınıf adını yazmaktır ve
tek dilli bir sistemde işe yarar. İki dilde yaramaz: `App\Jobs\SendInvoice`
Python tarafında bir sınıf değil, anlamsız bir dize. Kimlik, onu üreten dilin
ad alanından bağımsız olmak zorundaydı.

**Şema `schema_version 1`'de donduruldu.** Genişletilebilir bir sözleşme yazmak
daha esnek olurdu; alan eklemek serbest kalırdı. Bedeli, bugün yazılan bir
üreticinin yarın eklenen bir tüketiciyle aynı teli paylaşacağının garanti
edilememesiydi. Dondurulmuş şema bu garantiyi veriyor ve karşılığında genişleme
serbestisini alıyor — bir standart için doğru takas, bir uygulama için
olmazdı.

İkisinin ortak sonucu benimsemenin artımlı olabilmesi: BabelQueue olmayan
mevcut işler bozulmadan çalışmaya devam ediyor, geçiş kuyruk kuyruk yapılıyor.

## Tek jenerik SDK yerine dil başına adaptör

Üçüncü karar dağıtım tarafındaydı. Zarf bir spesifikasyon olduğuna göre tek bir
referans kütüphane yazıp "gerisi sizin işiniz" demek yeterdi; okuyan herkes
kendi diline taşırdı.

O yol sözleşmeyi kâğıtta bırakırdı. Bir kuyruk standardının benimsenmesi zarfı
anlamakla değil, mevcut iş altyapısına takılmasıyla oluyor — ve o altyapı dile
değil framework'e ait. Bu yüzden her dil kendi SDK'sıyla ve o dilin gerçekten
kullanılan framework adaptörleriyle geliyor. Labs aşamasında kapsam dört dildi:
PHP'de Laravel ve Symfony, Python'da Celery ve Django, Go'da Redis/RabbitMQ
transport'ları, Node.js'te BullMQ ve NestJS.

Bedeli bakım yüzeyi: dil başına bir SDK, bir sürüm hattı, bir paket kaydı.
Karşılığında geçiş, mevcut kuyruk kodunu yeniden yazmayı değil bir adaptör
takmayı gerektiriyor.

## Spesifikasyona giden yol

Zarf bir spesifikasyona ve çok dilli SDK setine dönüştü: dört dil altıya çıktı —
Java'da Spring Boot, .NET'te MassTransit eklendi — ve dağıtım her ekosistemin
kendi kanalına bağlandı: Packagist, PyPI, pkg.go.dev, npm, Maven Central,
NuGet. BabelQueue artık kendi alan adı olan bir standart. Ayrıntısı
portfolyoda.
