Log-Merkezli Akış: Bölümleme, Sıfır-Kopyalama I/O & Tüketici Grubu Protokolleri
Yüksek verimli dağıtık commit loglarının mimarisi: sıralı disk erişim mekaniği, Linux çekirdeği sendfile() sıfır-kopyalama ağ transferi, bölüm anahtarı hashleme ve kooperatif rebalance.
Log-Merkezli Akış: Bölümleme, Sıfır-Kopyalama I/O & Tüketici Grubu Protokolleri
Yönetici Özeti
Modern dağıtık akış platformları, geçici bellek içi kuyruklar yerine kalıcı ve yalnızca-eklenebilir (append-only) commit loglarını temel alır. Veri akışlarını diske sıralı olarak yazılan, değişmez ve tamamen sıralı olay dizileri olarak modelleyen Apache Kafka ve Redpanda gibi sistemler, deterministik yeniden oynatma imkanı ile saniyede milyonlarca mesaj işleme kapasitesine ulaşır.
1. Çekirdek Sıfır-Kopyalama (Zero-Copy) I/O Avantajı
Geleneksel mesaj kuyrukları veriyi kullanıcı alanı (user-space) bellek tamponları üzerinden kopyalar: $$\text{Disk} \rightarrow \text{İşletim Sistemi PageCache} \rightarrow \text{Uygulama Belleği} \rightarrow \text{Soket Tamponu} \rightarrow \text{Ağ Kartı (NIC)}$$ Bu işlem 4 bağlam değişimi (context switch) ve 3 gereksiz bellek kopyalaması yaratır.
Kafka, Linux çekirdeğinin `sendfile()` sistem çağrısını (Zero-Copy) kullanarak kullanıcı alanını tamamen atlar:
Sonuç: CPU yükü %80 azalır ve ağ çıkışı, işletim sistemi disk önbelleğinden doğrudan 100 Gbps ağ hatlarını doyurabilir.
2. Bölüm Anahtarı Hashleme ve Sıralama Garantisi
Bir Kafka konusu (topic), $P$ adet fiziksel bölümden (partition) oluşur. Katı toplam sıralama yalnızca tek bir bölüm sınırları içinde garanti edilir. Aynı bölüm anahtarına sahip mesajlar MurmurHash2 ile deterministik olarak aynı bölüme atanır: $$\text{Bölüm ID} = |\text{MurmurHash2}(\text{key})| \pmod P$$
3. Kooperatif Yapışkan (Cooperative Sticky) Tüketici Rebalance Protokolü
Eski rebalance protokolleri (Eager Rebalance), bir tüketici gruba katıldığında veya ayrıldığında gruptaki tüm tüketicilerin işleme durdurup bölümlerini bırakmasına neden oluyordu (stop-the-world gecikme fırtınası). Cooperative Sticky Assignor protokolü bu sorunu çözer:
- Yalnızca başka bir tüketiciye taşınması gereken belirli bölümler iptal edilir.
- Etkilenmeyen tüketiciler mevcut bölümlerini kesintisiz olarak işlemeye devam eder.
