代码之家  ›  专栏  ›  技术社区  ›  AndCode

当Kafka消费者在活动时失去与Kafka的连接,并被另一个消费者取代时,如何避免数据冲突?

  •  0
  • AndCode  · 技术社区  · 2 年前

    我们有一个解决方案,生产者将数据发送到Kafka主题的多个分区,属于特定用户的消息总是在同一个分区中结束(消息密钥分区)。我们需要属于同一用户的数据在消费者端严格按顺序处理。

    然而,可能存在这样的情况:从分区1消费的消费者a正在失去与Kafka的连接,并且Kafka决定它失去了消费者a,并将分区1重新分配给消费者B。

    消费者A仍然可以处于活动状态并处理用户X的数据。同时,消费者B从分区1中接收到下一条消息,它原来是与用户X相关的另一部分数据。在这种过渡情况下,我们让两个消费者并行处理同一用户的数据,并且存在竞争条件的可能性。

    类似的问题是,当我们添加新的消费者来扩大规模时,在这种情况下,在重新平衡后的过渡期内,两个消费者可能正在处理同一用户的数据消息。在这种情况下,静态组成员身份没有帮助。

    在消费者重新安排分区的过渡情况下,我们如何避免这种冲突?

    0 回复  |  直到 2 年前
        1
  •  1
  •   OneCricketeer Gabriele Mariotti    2 年前

    您的消费者代码应该捕获 WakeupException 同时进行民意调查,并在该集团重新平衡之前立即停止处理所看到的任何数据。

    除此之外,您还可以实现分布式锁定,但Kafka本身并不提供此功能。不过,你可以使用动物园管理员。