- xkafka, Kafka'yı Go ortamında bir HTTP servisi kadar basit kullanmayı sağlayan açık kaynaklı bir kütüphanedir
- Mevcut confluent-kafka-go kullanımında karmaşık işleme döngüleri ve çok sayıda boilerplate kod gerekirken, xkafka Handler, Middleware, Message yapısıyla çekirdek mantığa odaklanmayı sağlar
- Mesaj yayımlama ve tüketme işlemlerini HTTP istek/yanıt modeli kadar sezgisel hale getirir; offset yönetimi, eşzamanlılık ayarları, hata yönetimi gibi Kafka'nın karmaşıklığını büyük ölçüde gizler
- Streaming/Batch işleme, sıralı/eşzamansız işleme, At-most-once/At-least-once garantisi gibi gerçek servislerde gereken çeşitli kalıpları basitçe destekler
- Katmanlı hata yönetimi, middleware tabanlı yeniden deneme/loglama/metrikler gibi pratikte ihtiyaç duyulan kalıplar kolayca uygulanabilir
HTTP benzeri Kafka
- xkafka, Kafka'yı Go'da bir HTTP servisi gibi soyutlayan bir kütüphanedir
- Message, bir HTTP isteğine benzer ve topic/partition/offset/key/value/header/callback gibi öğeleri içerir
- Handler, HTTP Handler gibi iş mantığını işler
- Middleware, loglama, metrikler, yeniden deneme gibi ek işlevlerin iş mantığından ayrılarak uygulanmasını sağlar
Mesaj yayımlama (Publishing Messages)
xkafka.NewProducer ile bir Producer oluşturulduktan sonra, mesaj nesnesi hazırlanıp Publish fonksiyonuyla yayımlanır
- Eşzamansız yayımlama (
AsyncPublish) ve callback kaydı mümkündür; bu da yüksek performanslı veya eşzamansız olay işlemeyi kolaylaştırır
- Arka plandaki goroutine'ler mesaj iletimini yürütür ve callback üzerinden iletim durumu izlenebilir
Mesaj tüketimi (Consuming Messages)
- Consumer oluşturulurken Handler fonksiyonu ile topic/broker/ayarlar gibi bilgiler belirtilir
consumer.Use() ile middleware eklenebilir
consumer.Run(ctx) ile mesaj tüketimi başlatılır
Streaming vs. Batch
- Streaming: Mesaj geldiği anda tek tek işlenir. Düşük hacimli iş yükleri, bellek tasarrufu ve güçlü işleme garantileri için uygundur
- Batch: Belirli sayıda mesaj veya zaman aralığına göre toplu işlenir. Yüksek throughput sistemleri veya downstream yükünü azaltmak için uygundur
Sequential veya Async
- Varsayılan davranış sıralı işlemedir (Sequential) — bir mesaj işlenmeden sıradaki okunmaz
xkafka.Concurrency(N) kullanıldığında N mesajın (veya batch'in) aynı anda işlendiği eşzamansız (Async) mod desteklenir
Offset yönetimi
- Kafka'nın varsayılan davranışında mesaj teslim edilir edilmez offset ilerletilir; bu da arıza durumunda mesaj kaybına yol açabilir
- xkafka,
enable.auto.offset.store=false ayarıyla offset'i yalnızca mesajın (veya batch'in) işlenmesi tamamlandıktan sonra saklar
- Mesaj durumunu ayrı bir DB veya kuyrukta tutmaya gerek kalmadan, Kafka üzerinde işleme garantisi sağlanabilir
-
At-Most-Once Guarantee
- Varsayılan olarak Kafka'nın
enable.auto.commit=true davranışına göre offset arka planda commit edilir
xkafka.ManualCommit(true) ve sıralı işleme ile, her mesaj/batch için okumadan önce offset commit edilerek At-most-once garantisi sağlanır
-
At-Least-Once Guarantee
xkafka.ManualCommit(true) ile eşzamanlılık (N>1) birleştirilerek, paralel işleme sırasında da offset'ler senkron biçimde sırayla commit edilir
- At-least-once garanti kalıbı kolayca uygulanabilir
Hata yönetimi
-
Handler seviyesi
- Handler içinde uygulama hataları işlenebilir ve örneğin Dead Letter Queue'ya gönderim yapılabilir
- Başarı durumunda
msg.AckSuccess(), atlama durumunda msg.AckSkip(), hata durumunda msg.AckFail(err) ile açık kontrol sağlanır
-
Middleware seviyesi
- Middleware içinde yeniden deneme, hata loglama gibi ortak mantık birden fazla Handler'da yeniden kullanılabilir
- Farklı hata türlerine göre farklı yeniden deneme politikaları veya işleme yöntemleri kolayca uygulanabilir
-
Global seviye
- Kafka broker/kütüphane hataları, zorunlu seçenek olan
xkafka.ErrorHandler içinde merkezi olarak ele alınır
- Bu handler non-nil bir hata döndürürse Consumer/Producer çalışması durdurulur
Sonuç
- xkafka, Apache Kafka'nın karmaşık kullanım deneyimini Go geliştiricileri için tanıdık bir HTTP sunucu yapısına dönüştürür
- Gereksiz boilerplate'i azaltır ve yalnızca iş mantığına odaklanılabilecek bir ortam sunar
- Mevcut confluent-kafka-go koduna kıyasla çok daha sade ve sezgiseldir
- Resmi dokümantasyon ve örnekler incelenerek hemen başlanabilir
1 yorum
Hmm, Go tarafında
sarama'nın daha çok tercih edildiğini biliyordum diye hatırlıyorum.. Kafka client'ı da düşünüldüğünden daha karmaşık; broker arızaları ya da istisna durumlarında gerçekten çok karmaşık hale geliyor, tüm vakaları kapsayıp kapsayamayacağı da..