मैं Confluent.Kafka .NET क्लाइंट संस्करण 1.3.0 का उपयोग कर रहा हूं। मैं डॉक्स का अनुसरण कर रहा हूं :
var consumerConfig = new ConsumerConfig
{
BootstrapServers = "server1, server2",
AutoOffsetReset = AutoOffsetReset.Earliest,
EnableAutoCommit = true,
EnableAutoOffsetStore = false,
GroupId = this.groupId,
SecurityProtocol = SecurityProtocol.SaslPlaintext,
SaslMechanism = SaslMechanism.Plain,
SaslUsername = this.kafkaUsername,
SaslPassword = this.kafkaPassword,
};
using (var consumer = new ConsumerBuilder<Ignore, string>(consumerConfig).Build())
{
var cancellationToken = new CancellationTokenSource();
Console.CancelKeyPress += (_, e) =>
{
e.Cancel = true;
cancellationToken.Cancel();
};
consumer.Subscribe("my-topic");
while (true)
{
try
{
var consumerResult = consumer.Consume();
// process message
consumer.StoreOffset(consumerResult);
}
catch (ConsumeException e)
{
// log
}
catch (KafkaException e)
{
// log
}
catch (OperationCanceledException e)
{
// log
}
}
}
समस्या यह है कि अगर मैं लाइन को कमेंट consumer.StoreOffset(consumerResult);
करता हूं , तो अगली बार जब मुझे कंस्यूम किया जाता है , तो मुझे अगले बिना सोचे-समझे मैसेज मिलते रहते हैं , यानी ऑफसेट बढ़ता रहता है, जो लगता नहीं है कि डॉक्यूमेंटेशन क्या दावा करता है, यानी कम से कम एक डिलीवरी ।
यहां तक कि अगर मैं EnableAutoCommit = false
कॉन्फ़िगर से 'EnableAutoOffsetStore = false' को सेट करता हूं और हटाता हूं , और उसके consumer.StoreOffset(consumerResult)
साथ प्रतिस्थापित करता consumer.Commit()
हूं, तब भी मुझे वही व्यवहार दिखाई देता है, अर्थात यदि मैं टिप्पणी करता Commit
हूं, तो भी मुझे अगले बिना संदेश के संदेश मिलते रहते हैं।
मुझे ऐसा लग रहा है कि मैं यहां कुछ मौलिक याद कर रहा हूं, लेकिन यह समझ नहीं सकता कि क्या। किसी भी मदद की सराहना की है!
EnableAutoCommit
सेट किया है उसके आधार पर दो परिदृश्यों का उल्लेख किया । मान लें कि हमारे पास है EnableAutoCommit = false
, और जब मैं Consume
, मुझे ऑफसेट 11 के साथ संदेश वापस मिल जाता है। मैं उम्मीद कर रहा था कि ऑफसेट के साथ एक ही संदेश को 11 से अधिक बार प्राप्त करता रहेगा यदि संदेश को संसाधित करता रहता है और इसलिए कॉल नहीं किया Commit
जाता है।
Consume
का उपयोग करके) Commit
आपके पास पहले से के बाद Subscribe
विषय के लिए .. काफ्का (ग्राहक lib के रूप में) के पीछे दृश्य सभी ऑफसेट इसमें एप्लिकेशन को भेज गया है का कहना है Consume
और यह उन्हें रैखिक भेज देंगे। तो एक संदेश को किसी विफलता परिदृश्य की तरह पुनरावृत्ति करने के लिए, आपको उन्हें अपने कोड में ट्रैक करना होगा और संदेश को संसाधित करना शुरू करना होगा और आपको यह भी पता होना चाहिए कि क्या छोड़ना है यदि यह पहले से ही अनुरोधों में संसाधित हो चुका है। मैं .net पुस्तकालय से परिचित नहीं हूँ, लेकिन यह वास्तव में मायने नहीं रखता क्योंकि यह कफ़्का डिजाइन है।