我正在经历 kafka
文档和
保证
在高层,Kafka提供了以下保证:
生产者发送到特定主题分区的消息将按发送顺序追加。也就是说,如果记录m1由与记录m2相同的生产者发送,并且首先发送m1,那么m1的偏移量将低于m2,并且在日志中出现得更早。使用者示例按记录在日志中的存储顺序查看记录。对于复制因子为n的主题,我们最多可以容忍n-1个服务器故障,而不会丢失提交到日志的任何记录。
我有几个问题。
总是保证 M1
偏移量将低于 M2
? 如果…怎么办 M1
重试时间晚于 M2
?
我也从各种文件中了解到,订购是不能保证的,消费者必须处理。
2条答案
按热度按时间6ie5vjzr1#
即使使用单个分区,也可能出现以下情况:
制作人发送
M1
制作人发送M2
M1
第一次尝试时由于一些失败而未被确认M2
已交付M1
在随后的尝试中交付。避免这种情况的一个简单方法是通过producer配置
max.in.flight.requests.per.connection=1
.这当然会影响性能,因此应谨慎使用。
8cdiaqws2#
请注意,排序保证适用于分区级别。因此,如果主题中有多个分区,则需要为需要按顺序显示的消息设置相同的分区键。
例如,如果您想收集来自各种传感器的消息,并且传感器有它的id,那么如果您将此id用作消息密钥,则每个传感器的消息顺序将在使用者上得到保证(因为没有传感器会将消息写入超过1个分区)。
回答您的问题:
对,
M1
将始终偏移低于M2
. 偏移量是由代理设置的,因此消息到达代理的时间在这里是关键的。仅在主题级别不能保证排序