我在1.0.0-cp1版本的Kafka集群的工作台上工作。
在我的工作室的一部分,他们专注于订购保证和没有数据丢失的最大吞吐量(只有一个分区的主题),我需要将max.in.flight.requests.per.connection
属性设置为1
吗?
我已阅读this article
我明白,如果我使用retries
属性在我的制作人处启用重试功能,我只需要将max.in.flight设置为1。
另一种问我问题的方法:只有一个分区+ retries = 0(生产者道具)足以保证Kafka的订购?
我需要知道,因为增加max.in.flight会大大增加吞吐量。
答案 0 :(得分:9)
您的用例有点不清楚。您提到了排序,没有数据丢失,但没有指定您是否容忍重复的消息。如果你想要至少一次(QoS 1)或者完全一次
那么这是不洁净的无论哪种方式,当您使用1.0.0并且仅使用单个分区时,您应该查看Idempotent Producer而不是调整Producer配置。它允许正确有效地保证订购并且不会丢失数据。
来自文档:
幂等传递确保消息只传送一次 在单个生命周期内的特定主题分区 生产者。
早期的幂等制作人强迫max.in.flight.requests.per.connection
为1(出于你提到的相同原因),但在最新版本中,它现在可以与max.in.flight.requests.per.connection
一起使用,最多可设置为5并保持其保证
使用Idempotent Producer,您不仅可以获得更强的传递语义(完全一次而不是至少一次),但它甚至可能表现更好!
回到你的问题
没有幂等(或事务)生成器,如果您想避免数据丢失(QoS 1)并保留排序,则必须将max.in.flight.requests.per.connection
设置为1,允许retries
并使用{{ 1}}。如您所见,这会带来显着的性能成本。
答案 1 :(得分:2)
是的,您必须将max.in.flight.requests.per.connection
属性设置为1
。
在您已阅读的文章中,这是作者写的一个初始错误(当前已纠正):
最大航班数/每次会话
在Kafka文档中不存在。
此勘误可能来自《 卡夫卡权威指南》(第一版)一书,您可以在第52页中阅读该书:
<...因此,如果保证订单的要求很严格,我们建议设置
in.flight.requests.per.session=1
,以确保 邮件正在重试,其他邮件将不会发送...>