kafka在partition数或者consumer数发生改变的时候,会发生消息乱序吗?

小鱼Sonic 发表于: 2020-01-04   最后更新时间: 2020-01-04 14:31:08   2,495 游览

kafka消息按照某个key来发到特定的partition,可以保持相同key的顺序。那在partition数或者consumer数发生改变的时候,会发生消息乱序吗?

发表于 2020-01-04
添加评论

每个partition的消息都是按顺序的,同一时刻只有1个分区对应1个消费者,所以单个分区是不会乱序。

小鱼Sonic -> 半兽人 5年前

partition数改变的话,同一个key可能发到另一个partition吧,这样这个key的消息就可能发生乱序?
consumer数改变的话,假如某个partition的consumer发生变化,kafka能保证:在旧consumer把拿到的消息都全部commit之后,新consumer才开始消费么?

半兽人 -> 小鱼Sonic 5年前

1、key可能发送到另外一个partition,这个你的规则一开始就要确定的,即使有新增的partition,也不应把消息发到新的分区上。
2、kafka当然无法保证旧的consumer把拿到的消息全部commit了,因为consumer重新选举触发了,说明旧的consumer已经失联了。

小鱼Sonic -> 半兽人 5年前
  1. kafka默认就是对partition数取模的。不把消息发到新的partition上,这个需要用自定义partitioner么?
  2. 这样说的话,当consumer重启的时候,就会发生rebalance导致潜在的消息乱序咯?
半兽人 -> 小鱼Sonic 5年前

你的问题一开始就说明了在特定的分区上,我理解的是你已经做了分区指定规则,而不是因为有了新的就发到新的。
有了新的分区,也必须是通过自己的规则,将特定的一类消息放到该分区上,才行。

kafka的乱序是consumer造成的,parition先进先出顺序保证,但是消费者的能力不一,有的处理的快,有的处理的慢,必定会乱,所以kafka推荐如果需要强一致,就只能有1个分区。而你通过规则设置不同的key,消费分到“特定的分区”,和kafka的1个分区效果是一样的。

小鱼Sonic -> 半兽人 5年前

那就是说,即使只有1个partition,但如果发生rebalance的话,在新旧两个consumer之间,仍然可能出现消息乱序咯?

半兽人 -> 小鱼Sonic 5年前

你要控制consumer如何提交offset了,如果你业务很多问题,消费者写的不好,你还要面临重复消费或漏消息的问题。

你的答案

查看kafka相关的其他问题或提一个您自己的问题