Kafka能否实现多个消费者的有序处理?

Can I achieve ordered processing with multiple consumers in Kafka?

在 Kafka 中,我有一个生产者在排队等待客户的工作。每件作品都有一个客户 ID。不同客户的工作可以乱序处理,但一个客户的工作必须按顺序处理。

为此,我打算有(例如)20个主题来实现并行。生产者将一个客户端 ID 的工作排队到 topic[client ID mod 20]。然后我打算让许多消费者都能处理任何客户的工作,但我仍然希望按顺序处理这些工作。这意味着在前一个工作完成之前,不能开始处理主题中的下一个工作价格。如果消费者失败,处理两次工作是可以的,但这意味着该主题的偏移量无法进行到下一个工作。

注意:每秒消息数比较少(10s-100s消息)。

总结一下:

这可以使用 Kafka 完成吗?

是的,你可以用 Kafka 做到这一点。但是你不应该完全按照你描述的方式去做。如果您为每条消息提供一个键,Kafka 已经支持主题内的语义分区。在本例中,您将创建一个包含 20 个分区的主题,然后将每条消息的键设为客户端 ID。这保证了所有具有相同密钥的消息最终都在同一个分区中,即它将执行您要手动执行的分区。

消费时,使用高级消费者,它会自动平衡可用消费者之间的分区。如果你想绝对保证至少处理一次,你应该手动提交偏移量,并确保你在提交之前已经完全处理了你消费过的消息。请注意,消费者加入或离开组会导致实例之间的分区重新平衡,您必须确保正确处理(例如,如果您的处理是有状态的,则必须确保状态可以在两者之间移动重新平衡后的消费者)。