我正在查看kafka
文档并遇到了
担保
在高层,Kafka提供以下保证:
生产者发送到特定主题分区的消息将是 附在发送顺序中。也就是说,如果发送了记录M1 通过与记录M2相同的生产者,首先发送M1,然后发送M1 将具有比M2更低的偏移量并且在日志中更早出现。一个 消费者实例按照它们存储在的顺序查看记录 登录。对于复制因子为N的主题,我们最多可以容忍N-1 服务器故障而不会丢失任何提交给日志的记录。
我几乎没有问题。
M1
的偏移量低于M2
?如果在M1
之后重试M2
会怎么样?答案 0 :(得分:4)
即使使用单个分区,可能出现的情况是:
M1
M2
M1
在第一次尝试时没有被确认M2
已发送M1
将在随后的尝试中发送。避免这种情况的一种简单方法是通过生产者配置max.in.flight.requests.per.connection=1
。
这当然会影响性能,因此应谨慎使用。
答案 1 :(得分:2)
请注意,订购保证适用于分区级别。因此,如果主题中有多个分区,则需要为需要按顺序显示的消息设置相同的分区键。
例如,如果您想从各种传感器收集消息并且传感器具有ID,那么如果您使用此ID作为消息密钥,则消费者将保证从每个传感器订购消息(因为没有传感器会将消息写入超过1个分区)。
回答你的问题:
M1
总是偏移低于M2
。偏移量由经纪人设定,因此消息到达经纪人的时间是关键。答案 2 :(得分:0)
我有一篇关于深入理解Kafka提供的排序保证的文章。 您可以在我的媒体 post 中查看。