【问题标题】:Can I achieve ordered processing with multiple consumers in Kafka?Kafka可以实现多消费者的有序处理吗?
【发布时间】:2015-08-06 23:20:31
【问题描述】:

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

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

注意:每秒的消息数量相当少(10s-100s 消息)。

总结一下:

  • “至少一次”处理每条消息 (=work)
  • 为了处理一个主题的工作
  • 每个主题有多个消费者以支持消费者失败

这可以使用 Kafka 完成吗?

【问题讨论】:

    标签: message-queue apache-kafka


    【解决方案1】:

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

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

    【讨论】:

    • 主题分区的消费者之间是否存在某种领导者选举?因此,如果消费者未能处理一系列抵消 - 另一个消费者承担工作?谢谢
    • 如果您使用高级消费者,他们会协调对分区进行负载平衡。在任何给定时间,每个分区只会分配组中的一个消费者实例。通常你会看到消费者实例完全离开组(即进程死亡),这将导致分区被重新平衡,并且不同的消费者实例将填补空缺。
    猜你喜欢
    • 2016-06-06
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    相关资源
    最近更新 更多