说明
我有个主题要谈
保证“至少一次”发送,以及
拥有尽可能高的可用性。
我在一个循环中设置了一个异步生产者,在一个主题“testtopic”上发送100万条随机消息。主题“testtopic”位于我的3代理集群中的3个分区上,并且被设置为3的复制因子。
这一切在正常情况下都能很好地工作,但是,我需要测试服务器在高负载的传入消息期间可能发生故障的可能性。
为了创建这个场景,我从producer开始,它需要几分钟来发送它的100万条消息,在这段时间内我将停止( docker stop
)无论仲裁人选择哪个经纪人作为控制人(如日志所示)。
当我这样做时,我希望Kafka的“至少一次”保证,即使控制器坏了,也能传递所有200万条信息。然而,每次我这样做,我可以看到一个一百至几千条消息的损失。
我尝试过将生产者设置为同步,如下所示:
producer.ProduceAsync("garytest011", key, msgToSend.Msgs.ToString()).Result;
然而,这完全坦克我的吞吐量正如文件所说,它会。
保证“至少一次”发送而不影响我的性能的最佳方法是什么?
如何繁殖
我在3个独立的虚拟机上运行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}'
我看到任何地方从100到几千少于100万。
暂无答案!
目前还没有任何答案,快来回答吧!