Kafka dotnet库在高可用性生产者

时间:2017-12-05 20:33:49

标签: c# docker apache-kafka confluent confluent-kafka

描述

我有一个需要的主题

  • 保证“至少一次”发送,
  • 具有尽可能高的可用性。

我在循环中设置了一个异步生成器,在主题“testtopic”上发送了100万条随机消息。 “testtopic”主题位于我的3代理群集中的3个分区上,并设置为3的复制因子。

这一切在正常情况下都能很好地工作,但是,我需要测试服务器在高负载传入消息期间可能发生的意外情况。
为了创建这个场景,我开始生产者,这将花费几分钟发送其100万条消息,在此期间,我将停止(docker stop)仲裁当选为控制器的任何经纪人(从日志中看到)。

当我这样做时,我希望Kafka的“至少一次”保证即使控制器发生故障也能提供所有200万条消息。但是,每次我这样做,我都会看到丢失一百到几千条消息。

我尝试将生产者设置为同步,如下所示:

producer.ProduceAsync("garytest011", key, msgToSend.Msgs.ToString()).Result;
然而,正如文档所说的那样,这完全可以满足我的吞吐量 什么是保证“至少一次”发送而不会破坏我的表现的最佳方式?

如何重现

我在3个独立的vm上运行ZooKeeper / Kafka的3个代理群集 所有设置都设置为默认值 在C#.NET CORE 2.0控制台应用程序中,我创建了一个基本生成器,如下所示: https://github.com/gazareid/gaza-confluent-kafka-dontnet-producer/blob/master/Program.cs

当进程正在运行时,我停止kafka选择的控制器来模拟服务器。

因为循环完成了100万次,所以主题中应该有100万条消息。 (或者更多,因为至少一次处理重复)

我使用以下命令计算主题中的消息:

docker run --net=host --rm confluentinc/cp-kafka:3.3.1 kafka-run-class kafka.tools.GetOffsetShell --broker-list localhost:29092 --topic testtopic --time -1 --offsets 1 | awk -F ":" '{sum += $3} END {print sum}'

我看到的地方从一百到几千不到一百万。

0 个答案:

没有答案