Güncelleme_2024-11-13
- İlk raporda, auto-commit etkin tüketicilerin son
poll çağrısında dönen ofsetleri otomatik olarak commit ederek veri kaybına yol açabileceği öne sürülmüştü.
- Ancak birçok okur, auto-commit tüketicilerin gerçekte son
poll değil, ondan önceki poll çağrısının ofsetlerini commit ettiğini belirterek buna itiraz etti.
- Java Kafka istemcisiyle yapılan deneyler de bunu destekliyor; ancak davranış istemciye göre değişebilir.
- Rapordan auto-commit ile ilgili bu spesifik iddia kaldırıldı; ek araştırma gerekiyor.
Arka plan
- Kafka, replikasyon, sharding ve append-only log sağlayan popüler bir streaming sistemidir.
- Bufstream, bulut ortamında veri yönetişimi ve maliyet verimliliğini önceleyen, Kafka'ya alternatif bir çözümdür.
- Kafka'ya benzer şekilde Bufstream, topic adı verilen kısmen sıralı log kümeleri sunar ve her topic partition'lara ayrılır.
- Bufstream, standart Kafka istemcileriyle uyumludur ve Kafka API sunan durumsuz bir servis olan agent, veriyi depolayan object store ve bir coordination service bileşenlerinden oluşur.
- Bufstream, veri depolamayı doğrudan object storage servisine yazarak maliyetleri düşürür ve durumsuz, otomatik ölçeklenebilir VM'ler üzerinde çalıştırılabilir.
İstemci güvenliği
- Bufstream, çeşitli streaming uygulamaları için tasarlanmıştır ve güvenli davranış için çeşitli istemci yapılandırma seçenekleri belirler.
- Kafka'da olduğu gibi varsayılan olarak
acks = all kullanır ve veri kaybını önlemek için enable.auto.commit = false olarak ayarlanır.
- Tüketicinin tüm logu gözlemleyebilmesi için
auto.offset.reset = earliest kullanılır.
İşlemler
- Bufstream, Kafka'nın transaction sistemini destekler ve karmaşık yapılandırmalarla zayıf bir atomiklik biçimi sunar.
- Tüketiciler
read_uncommitted veya read_committed yalıtım seviyelerinde çalışabilir; read_committed bazı olguları (G1a, G1c) önler.
- Kafka, Redpanda ve Bufstream'in tümünde G0 olgusu görülür; bu da belgelenmiş yalıtım seviyesiyle tutarlı değildir.
Test tasarımı
- Bufstream 0.1.0'dan 0.1.3'e kadar test edildi; Jepsen test kütüphanesi ve Java Kafka Client kullanıldı.
- Testler, Bufstream'in güvenliğini değerlendirmek için çeşitli arızalar enjekte eder.
Kuyruk
- Kafka'nın veri modeline uygun bir kuyruk iş yükü tasarlanarak Bufstream üzerinde kullanıldı.
- Her mantıksal süreç, üretici, tüketici ve yönetici istemcilerini çalıştırır ve çeşitli anahtarlar için kayıtlar gönderir.
İptal
- Beklenmedik sonuçlara dayanarak, işlemleri iptal eden ve ofsetleri izleyen bir iş yükü tasarlandı.
- İptal edilen işlemlerden sonraki ofsetler dört kategoriye ayrıldı: ilerleme, geri sarma, daha fazla geri sarma, diğer.
Bufstream sonuçları
Takılan tüketici (#1)
- 0.1.0'dan 0.1.3-rc.8'e kadar
consumer.poll() çağrısının hemen dönüp hiçbir kayıt döndürmemesi sorunu görüldü.
- Bufstream, 0.1.3-rc.6'da önbelleği yenileyerek sorunu çözdü.
Takılan üretici ve tüketici (#2)
- 0.1.3-rc.6'da da
InitProducerId çağrısının veya listOffsets çağrısının başarısız olması sorunu görüldü.
- Bufstream, ek polling mantığı ekleyerek sorunu çözdü.
Hatalı 0 ofseti (#3)
- 0.1.0'dan 0.1.3-rc.2'ye kadar hatalı 0 ofseti atanması sorunu yaşandı.
- Bufstream, bu sorunu 0.1.3-rc.6'da çözdü.
Transaction yazma kaybı (#4)
- 0.1.2'de commit edilmiş transaction kayıtlarının kaybolması sorunu yaşandı.
- Bufstream, sorunu 0.1.3-rc2'de çözdü.
Sunucu tarafı filtreleme nedeniyle yazma kaybı (#5)
- 0.1.3-rc.8'de hafif bir arızaya tepki olarak yazma kaybı oluştu.
- Bufstream, bu sorunu 0.1.3-rc.12'de çözdü.
Kafka sonuçları
Yanıltıcı hata mesajı (KIP-588)
ProducerFencedException, transaction zaman aşımında da ortaya çıkabiliyor.
- Kafka ekibine hata mesajının değiştirilmesi öneriliyor.
Tüketici kapanışında sonsuz bekleme olasılığı (KAFKA-17734)
Consumer.close() çağrısının ağ IO sırasında sonsuza kadar beklemesi sorunu var.
- Sorun KAFKA-17734 üzerinden takip ediliyor.
Transaction başarısızlığından sonra öngörülemez tüketici ofsetleri (KAFKA-17582)
- Transaction başarısız olduğunda tüketici ofsetlerinin amaçlanan davranışına ilişkin dokümantasyon yetersiz.
- Tüketici, iptal edilen bir transaction sonrasında ofsetleri geri sarabilir veya ilerlemeye devam edebilir.
1 yorum
Hacker News görüşleri
Kafka’da ortaya çıkan sorunlar araştırılırken görünmez yazmalar tespit edilmiş. Bu, gecikmiş Produce mesajlarının gelecekteki transaction’lara dahil olarak transaction garantilerini ihlal edebileceğini düşündürüyor. Kafka Java Client’ın istek zaman aşımında sequence number’ı yeniden kullanabildiğine dair bir şüphe de var. Kafka üzerinde daha fazla test yapılması gerekiyor
Bufstream’in ürün sayfasına bakınca iki ifadenin nasıl birbiriyle uyumlu olduğu merak ediliyor
Kafka’nın auto-commit özelliği şaşırtıcı bulunmuş
pollmetodu her çağrıldığında dönen mesajların offset’lerini otomatik commit etmeye hazır hale geliyor. Mesaj işleme tamamlanmazsa, çökme durumunda mesaj ilerlemesinin kaybolma riski varKafka transaction protokolünün temelden sorunlu olduğu ve düzeltilmesi gerektiği düşünülüyor
Kyle’ın NATS Jetstream’i inceleyip incelemediği merak ediliyor
bufstream’in GitHub projesi bulunamamış. Bu konuda bir ipucu olup olmadığı soruluyor
İlgili blog yazıları ve belgeler okunduktan sonra, Kafka’nın "exactly-once delivery" kavramını "read-process-write operation" özelliği olarak tanımladığı görülüyor. Bunu transaction olarak açıklamak daha doğru olur gibi görünüyor
"Transaction’lar kısmen ya da tamamen gözlemlenebilir" ifadesinin aslında "consumer’lar kısmen ya da tamamen gözlemleyebilir" şeklinde okunması gerektiği düşünülüyor
Bu yazılımın ne için kullanıldığı merak ediliyor. Telemetri? Kara kutu?