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

小鱼Sonic 发表于: 2020-01-04   最后更新时间: 2020-01-04  

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



您需要解锁本帖隐藏内容请: 点击这里
本帖隐藏的内容




上一条: kafka磁盘写满
下一条: kafka生产者生成数据的时候,异步回调成功方法打印日志,会有相同的两条日志,感觉是重复生产。

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

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

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

              1. kafka默认就是对partition数取模的。不把消息发到新的partition上,这个需要用自定义partitioner么?
              2. 这样说的话,当consumer重启的时候,就会发生rebalance导致潜在的消息乱序咯?
                • 你的问题一开始就说明了在特定的分区上,我理解的是你已经做了分区指定规则,而不是因为有了新的就发到新的。
                  有了新的分区,也必须是通过自己的规则,将特定的一类消息放到该分区上,才行。

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