Kafka能否实现多个消费者的有序处理?
Can I achieve ordered processing with multiple consumers in Kafka?
在 Kafka 中,我有一个生产者在排队等待客户的工作。每件作品都有一个客户 ID。不同客户的工作可以乱序处理,但一个客户的工作必须按顺序处理。
为此,我打算有(例如)20个主题来实现并行。生产者将一个客户端 ID 的工作排队到 topic[client ID mod 20]
。然后我打算让许多消费者都能处理任何客户的工作,但我仍然希望按顺序处理这些工作。这意味着在前一个工作完成之前,不能开始处理主题中的下一个工作价格。如果消费者失败,处理两次工作是可以的,但这意味着该主题的偏移量无法进行到下一个工作。
注意:每秒消息数比较少(10s-100s消息)。
总结一下:
- 'At least once' 处理每条消息(=工作)
- 按顺序处理一个主题的工作
- 每个主题有多个消费者以支持消费者失败
这可以使用 Kafka 完成吗?
是的,你可以用 Kafka 做到这一点。但是你不应该完全按照你描述的方式去做。如果您为每条消息提供一个键,Kafka 已经支持主题内的语义分区。在本例中,您将创建一个包含 20 个分区的主题,然后将每条消息的键设为客户端 ID。这保证了所有具有相同密钥的消息最终都在同一个分区中,即它将执行您要手动执行的分区。
消费时,使用高级消费者,它会自动平衡可用消费者之间的分区。如果你想绝对保证至少处理一次,你应该手动提交偏移量,并确保你在提交之前已经完全处理了你消费过的消息。请注意,消费者加入或离开组会导致实例之间的分区重新平衡,您必须确保正确处理(例如,如果您的处理是有状态的,则必须确保状态可以在两者之间移动重新平衡后的消费者)。
在 Kafka 中,我有一个生产者在排队等待客户的工作。每件作品都有一个客户 ID。不同客户的工作可以乱序处理,但一个客户的工作必须按顺序处理。
为此,我打算有(例如)20个主题来实现并行。生产者将一个客户端 ID 的工作排队到 topic[client ID mod 20]
。然后我打算让许多消费者都能处理任何客户的工作,但我仍然希望按顺序处理这些工作。这意味着在前一个工作完成之前,不能开始处理主题中的下一个工作价格。如果消费者失败,处理两次工作是可以的,但这意味着该主题的偏移量无法进行到下一个工作。
注意:每秒消息数比较少(10s-100s消息)。
总结一下:
- 'At least once' 处理每条消息(=工作)
- 按顺序处理一个主题的工作
- 每个主题有多个消费者以支持消费者失败
这可以使用 Kafka 完成吗?
是的,你可以用 Kafka 做到这一点。但是你不应该完全按照你描述的方式去做。如果您为每条消息提供一个键,Kafka 已经支持主题内的语义分区。在本例中,您将创建一个包含 20 个分区的主题,然后将每条消息的键设为客户端 ID。这保证了所有具有相同密钥的消息最终都在同一个分区中,即它将执行您要手动执行的分区。
消费时,使用高级消费者,它会自动平衡可用消费者之间的分区。如果你想绝对保证至少处理一次,你应该手动提交偏移量,并确保你在提交之前已经完全处理了你消费过的消息。请注意,消费者加入或离开组会导致实例之间的分区重新平衡,您必须确保正确处理(例如,如果您的处理是有状态的,则必须确保状态可以在两者之间移动重新平衡后的消费者)。