【问题标题】:Kafka consumer synchronization behaviorKafka消费者同步行为
【发布时间】:2017-01-06 02:59:45
【问题描述】:

我目前正在探索 kafka 作为一个简单问题的初学者。

会有一个 Producer 将消息推送到一个 Topic 但会有 是 n 个 spark 应用程序的 Consumer 数量,从 kafka 并插入数据库(每个消费者插入不同的 表)。

是否有可能消费者会不同步(就像消费者的某些部分在相当长的一段时间内下降),然后 一个或多个消费者不会处理消息并插入到表中 ?

假设代码总是正确的,当 按摩数据。处理每条消息很重要 只有一次。

我的问题是 Kafka 是否会为我们处理这部分,或者我们是否必须编写一些其他代码来确保不会发生这种情况。

【问题讨论】:

    标签: asynchronous apache-kafka kafka-consumer-api


    【解决方案1】:

    您可以对消费者进行分组(请参阅group.id 配置),并且分组的消费者在它们之间拆分主题的分区。一旦一个消费者掉线,该组中的另一个消费者将接管被丢弃的消费者读取的分区。

    但是,可能存在一些问题:当消费者读取一个分区时,它会将偏移量提交回 Kafka,如果消费者在处理接收到的数据之后但在提交偏移量之前退出,其他消费者将从最新的可用偏移量开始读取。幸运的是,您可以管理如何提交偏移量的策略(请参阅消费者的设置 enable.auto.commitauto.offset.reset 等)

    Kafka and Spark Streaming guide 提供了一些关于如何管理偏移量的解释和可能的策略。

    【讨论】:

    • 看来 Kafka 无法保证消息只发送一次但至少发送一次。
    • 是的。这是分发成本和高性能。如果需要,您必须自己做。
    【解决方案2】:

    根据设计,Kafka 将生产者和消费者分离。消费者将尽可能快地阅读——消费者可以尽可能快地生产。

    可以将消费者组织成“消费者组”,您可以对其进行设置,以便多个消费者可以从一个组中读取数据,也可以将其设置为单个消费者从其自己的组中读取。

    如果您有 1 个消费者到 1 个群组,您(取决于您的确认策略)应该能够确保每条消息(每个消费者)只读一次。

    否则,如果您希望多个消费者从一个组中读取 - 同一件事 - 但消息由 n 个消费者中的一个读取一次。

    【讨论】:

      猜你喜欢
      • 2018-01-07
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多