在我们的应用程序中,属于同一客户的消息需要按顺序处理。为了实现这一点,我将消息的密钥设置为客户id。在应用程序中,每个消费者也由单个线程支持。
现在我们看到了由于某种原因(我正在试图找到)消息顺序被破坏的情况。问题是:Kafka是否在重新平衡期间保留消息顺序?也就是说,当分区被重新分配时(通常是当节点关闭或重新连接到集群时),Kafka是否会等待消息(这些消息已经被轮询,并且很可能也正在被活动客户处理)在将分区从一个消费者移动到另一个消费者之前进行处理和确认?
在我们的应用程序中,属于同一客户的消息需要按顺序处理。为了实现这一点,我将消息的密钥设置为客户id。在应用程序中,每个消费者也由单个线程支持。
现在我们看到了由于某种原因(我正在试图找到)消息顺序被破坏的情况。问题是:Kafka是否在重新平衡期间保留消息顺序?也就是说,当分区被重新分配时(通常是当节点关闭或重新连接到集群时),Kafka是否会等待消息(这些消息已经被轮询,并且很可能也正在被活动客户处理)在将分区从一个消费者移动到另一个消费者之前进行处理和确认?
1条答案
按热度按时间5vf7fwbs1#
每个消费者由单个线程支持
这意味着每个分区都将按顺序使用(按客户ID)。
Kafka是否在重新平衡期间保留消息顺序
重新平衡不影响代理上的消息顺序;偏移是不可变的。
真正改变的是,在重新平衡之后,您的消费者群体将重置其偏移量。如果你没有禁用自动偏移提交,那么你是否有生产者幂等和消费者读隔离也没关系,因为在10条消息中,如果你处理了5条,但只有3条是自动提交的,并且你重新平衡了,那么你在处理6+之前重新消耗了偏移量4和5。您可以通过确保每个偏移量都提交来解决这个问题,或者对每个记录进行外部数据库查找以确保它尚未被处理。