ฉันใช้ 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);
, ฉันได้รับข้อความ unconsumed ต่อไปในครั้งต่อไปที่ผมกินเช่นชดเชยช่วยเพิ่มซึ่งไม่ได้ดูเหมือนจะเป็นสิ่งที่เรียกร้องเอกสารที่มันไม่คือการส่งมอบอย่างน้อยหนึ่ง
แม้ว่าฉันจะตั้งค่าEnableAutoCommit = false
และลบ 'EnableAutoOffsetStore = false' จากการตั้งค่าและแทนที่consumer.StoreOffset(consumerResult)
ด้วยconsumer.Commit()
ฉันยังคงเห็นพฤติกรรมเดียวกันนั่นคือแม้ว่าฉันจะแสดงความคิดเห็นออกไปCommit
ฉันยังคงได้รับข้อความที่ยังไม่ได้อ่านต่อไป
ฉันรู้สึกว่าฉันขาดพื้นฐานบางอย่างที่นี่ แต่ไม่สามารถคิดได้ ความช่วยเหลือใด ๆ ที่เป็นที่นิยม!
EnableAutoCommit
ตั้งค่าเป็น สมมติว่าเรามีEnableAutoCommit = false
และเมื่อฉันConsume
ฉันได้รับข้อความกลับด้วยชดเชย 11. ผมคาดหวังที่จะให้ได้รับข้อความเดียวกันกับการชดเชย 11 กว่าและมากกว่าอีกครั้งถ้าการประมวลผลข้อความช่วยให้การขว้างปาและด้วยเหตุนี้ไม่ได้เรียกร้องให้Commit
ทำ
Consume
) โดยใช้Commit
หลังจากที่คุณมีSubscribe
หัวข้อแล้ว.. Kafka (เช่นเดียวกับไคลเอนต์ lib) ที่อยู่เบื้องหลังยังคงรักษา offsets ทั้งหมดที่มีการส่งไปยังแอปในConsume
และจะส่งเชิงเส้น ดังนั้นในการประมวลผลข้อความเช่นในสถานการณ์ความล้มเหลวคุณจะต้องติดตามพวกเขาในรหัสของคุณและพยายามที่จะชดเชยและเริ่มการประมวลผลข้อความและคุณควรรู้ว่าจะข้ามอะไรถ้ามันได้รับการประมวลผลในคำขอก่อนหน้านี้ ฉันไม่คุ้นเคยกับห้องสมุด. net แต่มันก็ไม่ควรสำคัญเพราะนี่คือการออกแบบคาฟคา