Kafka Rest代理消费者创造

时间:2016-07-07 23:40:11

标签: apache-kafka kafka-consumer-api

假设我有一项服务通过kafka-rest-proxy消费消息,并且始终在同一个消费者群体中。我们还要说它正在消耗一个有一个分区的主题。启动服务后,它会在kafka-rest-proxy中创建一个新的使用者,并使用生成的使用者URL直到服务关闭。当服务重新启动时,它将在kafka-rest-proxy中创建一个新的使用者,并使用新的url(和新的使用者)进行消费。

我的问题

  1. 由于kafka每个分区最多只能有一个消费者。当消费者重新启动时,kafka和kafka-rest-proxy会发生什么?即在kafka-rest-proxy中创建一个新的消费者,但旧的消费者没有机会被销毁。所以现在在kafka-rest-proxy'n'重启我的服务之后有'n'个消费者,但只有其中一个被积极消费。我是否能够消费新消费者的消息,因为消费者多于分区?

  2. 让我们更复杂一点,并说我在同一个使用者组中有5个服务实例,在主题中有5个分区。在'n'重新启动我的服务的所有5个实例后,我甚至可以保证在不确保对现有消费者进行适当销毁的情况下使用所有消息。即,当消费者对分区进行编号时,Kafka和kafka-rest-proxy在消费者创建过程中做了什么?

  3. 什么被认为是kafka-rest-proxy最佳做法,以确保陈旧的消费者总是被清理干净?你建议坚持消费者网址吗?在开始服务之前,我是否应该强制重启kafka-rest-proxy以确保现有消费者被销毁?

  4. *编辑* 我相信我的问题的一部分是通过这种配置来回答的,但不是全部。

    consumer.instance.timeout.ms - 自动销毁使用者实例之前的空闲时间。 输入:int 默认值:300000 重要性:低

1 个答案:

答案 0 :(得分:2)

  1. 如果您无法彻底关闭消费者,它将在最后一次请求后保持活跃状态​​。对于这种情况,代理将垃圾收集陈旧的消费者 - 如果它没有干净地关闭,消费者将无限期地保留一些分区。通过自动垃圾收集消费者,您不需要一些单独的持久存储来跟踪您的消费者实例。如您所发现,您可以通过config consumer.instance.timeout.ms控制此超时。

  2. 由于实例将被垃圾收集,因此您可以保证最终消耗所有消息。但是在超时期间,某些分区仍可能分配给旧的消费者组,并且您不会在这些分区上取得任何进展。

  3. 理想情况下,应用程序的不干净关闭很少,因此最佳做法是在应用程序关闭时清理消费者。即使在特殊情况下,您也可以使用finally / try / catch的{​​{1}}块来销毁消费者。如果一个人活着,它最终会恢复。除此之外,如果您的应用程序可以容忍,请考虑将finally设置调整为更低。它只需要大于使用消费者的调用之间的最长时间(并且您应该记住可能的错误情况,例如,如果处理消息需要与另一个系统交互并且该系统可能变得缓慢/不可访问,您应该考虑到设置此配置时。)

  4. 您可以保留URL,但即使这样也存在丢失消费者跟踪的风险,因为您无法自动创建使用者并将其URL保存到其他持久存储中。此外,由于完全不受控制的故障,你没有机会清理不应该是一个常见的情况,它通常不会对你有多大好处。如果您真的需要从该故障中快速恢复,那么无论如何,消费者实例超时可能会显着降低。

    Re:强制重启代理,这种情况相当罕见,因为REST代理通常是共享服务,这样做会影响正在使用它的所有其他应用程序。