- xkafka एक ओपन सोर्स लाइब्रेरी है जो Go वातावरण में Kafka को HTTP service की तरह सरल तरीके से इस्तेमाल करने में मदद करती है
- पहले confluent-kafka-go इस्तेमाल करते समय जटिल processing loop और बहुत सारा boilerplate code चाहिए होता था, लेकिन xkafka की Handler, Middleware, Message संरचना आपको core logic पर फोकस करने देती है
- message publish और consume को HTTP request/response पैटर्न की तरह सहज तरीके से handle किया जा सकता है, और offset management, concurrency settings, error handling जैसी Kafka की काफी जटिलता को छिपा देती है
- Streaming/Batch processing, sequential/async processing, At-most-once/At-least-once guarantee जैसे production service में जरूरी कई patterns को सरल रूप से support करती है
- layered error handling, middleware-आधारित retry/logging/metrics जैसे व्यावहारिक patterns को आसानी से लागू किया जा सकता है
HTTP-like Kafka
- xkafka Go में Kafka को HTTP service की तरह abstract करने वाली लाइब्रेरी है
- Message HTTP request जैसा है, जिसमें topic/partition/offset/key/value/header/callback आदि शामिल होते हैं
- Handler HTTP Handler की तरह business logic को process करता है
- Middleware logging, metrics, retry जैसी अतिरिक्त functionality को business logic से अलग रखकर लागू करने देता है
संदेश प्रकाशित करना (Publishing Messages)
xkafka.NewProducer से Producer बनाने के बाद, message object बनाकर Publish फ़ंक्शन से उसे publish किया जाता है
- async publish (
AsyncPublish) और callback registration संभव है, इसलिए high performance या async event processing आसान हो जाती है
- background goroutine में message delivery process होती है, और callback के जरिए delivery status track किया जा सकता है
संदेश उपभोग (Consuming Messages)
- Consumer बनाते समय Handler फ़ंक्शन, topic/broker/settings आदि निर्दिष्ट किए जाते हैं
consumer.Use() से middleware जोड़ा जा सकता है
consumer.Run(ctx) से message consumption शुरू होता है
Streaming vs. Batch
- Streaming: message आते ही उन्हें एक-एक करके तुरंत process किया जाता है। यह कम throughput, memory बचत, और मजबूत processing guarantee के लिए फायदेमंद है
- Batch: तय संख्या या समय इकाई के आधार पर messages को group करके process किया जाता है। यह high-throughput systems या downstream load कम करने के लिए उपयोगी है
Sequential or Async
- default रूप से sequential processing होती है — एक processing पूरी होने के बाद ही अगला message पढ़ा जाता है
xkafka.Concurrency(N) इस्तेमाल करने पर N messages (या batches) को साथ में process करने वाला async mode उपलब्ध होता है
ऑफसेट प्रबंधन
- Kafka का default व्यवहार message delivery होते ही offset को आगे बढ़ा देता है, इसलिए failure की स्थिति में message loss की संभावना रहती है
- xkafka
enable.auto.offset.store=false सेट करके, message (या batch) की processing पूरी होने के बाद ही offset store करता है
- अलग DB या queue में message state manage किए बिना भी Kafka में processing guarantee हासिल की जा सकती है
-
At-Most-Once Guarantee
- मूल रूप से Kafka के
enable.auto.commit=true के अनुसार background में offset commit होता है
xkafka.ManualCommit(true) और sequential processing के साथ, हर message/batch को पढ़ने से पहले offset commit करके At-most-once guarantee दी जा सकती है
-
At-Least-Once Guarantee
xkafka.ManualCommit(true) और concurrency (N>1) को मिलाकर, parallel processing के दौरान भी offsets को synchronous और क्रमवार commit किया जा सकता है
- At-least-once guarantee pattern को आसानी से लागू किया जा सकता है
एरर हैंडलिंग
-
Handler स्तर
- Handler के भीतर application errors handle किए जा सकते हैं और Dead Letter Queue में भेजना आदि भी संभव है
- सफलता पर
msg.AckSuccess(), skip करने पर msg.AckSkip(), और failure पर msg.AckFail(err) जैसी explicit control methods उपलब्ध हैं
-
Middleware स्तर
- middleware में retry, error logging जैसी common logic को कई Handlers में reuse किया जा सकता है
- अलग-अलग errors के अनुसार अलग retry policy या handling method आसानी से लागू किए जा सकते हैं
-
Global स्तर
- Kafka broker/library errors को required option
xkafka.ErrorHandler में centrally handle किया जाता है
- अगर यह handler non-nil error लौटाता है, तो Consumer/Producer का संचालन रुक जाता है
निष्कर्ष
- xkafka Apache Kafka के जटिल उपयोग अनुभव को Go developers के लिए परिचित HTTP server संरचना में बदल देता है
- यह अनावश्यक boilerplate को कम करता है और केवल business logic पर फोकस करने का माहौल देता है
- मौजूदा confluent-kafka-go code की तुलना में यह कहीं अधिक संक्षिप्त और सहज है
- आधिकारिक दस्तावेज़ और उदाहरण देखकर तुरंत शुरुआत की जा सकती है
1 टिप्पणियां
हम्म, मुझे लगा था कि golang में
Sarama को ज़्यादा पसंद किया जाता है..
सोच से भी ज़्यादा, Kafka client तो.. broker failure या exception आने पर काफ़ी जटिल हो जाता है,
पता नहीं क्या यह सभी cases को cover कर पाएगा..