我在1.0.0-cp1版本的kafka集群的长凳上工作。
在我的工作台上,有一部分人专注于最大吞吐量,并保证排序和无数据丢失(一个只有一个分区的主题),我需要设置 max.in.flight.requests.per.connection
属性到 1
?
我读过这篇文章
我明白,如果我在我的制作者处启用了重试功能,我只需要将max.in.flight设置为1 retries
财产。
问我问题的另一种方式:只有一个分区+重试次数=0(生产者道具)就足以保证Kafka中的排序?
我需要知道,因为增加最大飞行时间会大大增加吞吐量。
2条答案
按热度按时间h9a6wy2h1#
你的用例有点不清楚。您提到了排序和无数据丢失,但没有指定是否允许重复消息。所以,如果你想要至少一次(qos 1)或者正好一次,这是不干净的
不管是哪种方式,由于您使用的是1.0.0并且只使用一个分区,您应该查看幂等生产者,而不是调整生产者配置。它允许适当和有效地保证有序和没有数据丢失。
根据文件:
幂等传递确保消息在单个生产者的生存期内只传递一次到特定的主题分区。
早期的幂等生产者
max.in.flight.requests.per.connection
到1(与您提到的原因相同),但在最新版本中,它现在可以与一起使用max.in.flight.requests.per.connection
设置为5并且仍然保持其保证。使用幂等生产者,您不仅可以获得更强的交付语义(准确地一次而不是至少一次),而且它甚至可以执行得更好!
我建议您检查文档中的交付语义
回到你的问题上来
是的,没有幂等(或事务)生产者,如果您想避免数据丢失(qos 1)并保持顺序,您必须设置
max.in.flight.requests.per.connection
到1,允许retries
使用acks=all
. 正如您所看到的,这需要付出巨大的性能代价。q35jwt9p2#
是的,你必须设置
max.in.flight.requests.per.connection
属性到1
. 在你读过的文章中,这是一个最初的错误(目前已更正),作者写道:每个会话的最大in.flights.requests
这在Kafka的文献中是不存在的。
本勘误表可能来自《Kafka权威指南》(第1版),您可以在第52页阅读:
<…因此,如果保证订单至关重要,我们建议设置
in.flight.requests.per.session=1
确保当一批邮件正在重试时,不会发送其他邮件…>