Kafka Rest Proxy 消费者创建

Kafka Rest Proxy Consumer Creation

假设我有一个服务,它通过 kafka-rest-proxy 消费消息并且总是在同一个消费者组中。我们还假设它正在消耗一个具有一个分区的主题。当服务启动时,它会在kafka-rest-proxy中创建一个新的消费者,并使用生成的消费者url,直到服务关闭。当服务恢复时,它会在kafka-rest-proxy中创建一个新的消费者,并使用新的url(和新的消费者)进行消费。

我的问题

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

  2. 让我们更复杂一点,假设我在同一个消费者组上有 5 个服务实例,在主题中有 5 个分区。 'n' 重新启动我的服务的所有 5 个实例后,我什至可以保证在不确保正确销毁现有消费者的情况下使用所有消息。即当消费者超过分区数量时,Kafka 和 kafka-rest-proxy 在消费者创建期间做什么?

  3. 什么被认为是 kafka-rest-proxy 最佳实践,以确保始终清理陈旧的消费者?您是否建议坚持使用消费者 url?我应该强制重启 kafka-rest-proxy 以确保现有消费者在开始我的服务之前被销毁吗?

* 编辑 * 我相信这个配置可以回答我的部分问题,但不是全部。

consumer.instance.timeout.ms - 自动销毁消费者实例之前的空闲时间。 类型:整数 默认值:300000 重要性:低

  1. 如果您不能完全关闭消费者,它会在最后一次向它发出请求后存活一段时间。对于这种情况,代理将垃圾收集陈旧的消费者——如果它没有完全关闭,消费者将无限期地保留某些分区。通过自动垃圾收集消费者,您不需要一些单独的持久存储来跟踪您的消费者实例。正如您所发现的,您可以通过配置 consumer.instance.timeout.ms.

  2. 控制此超时
  3. 由于实例将被垃圾回收,因此您最终会消耗掉所有的消息。但是在超时期间,一些分区可能仍然分配给旧的消费者集,你不会在这些分区上取得任何进展。

  4. 理想情况下,应用程序不正常关闭的情况很少见,因此最佳做法是在应用程序关闭时清理消费者。即使在特殊情况下,您也可以使用 try/catch/finallyfinally 块来销毁消费者。如果一个人还活着,它最终会康复。除此之外,如果您的应用程序可以接受,请考虑将 consumer.instance.timeout.ms 设置调低。它只需要大于使用消费者的调用之间的最长周期(并且您应该记住可能的错误情况,例如,如果处理消息需要与另一个系统交互并且该系统可以变为 slow/inaccessible,您应该在设置此配置时考虑到这一点)。

您可以保留 URLs,但即使这样也有失去对消费者跟踪的风险,因为您无法自动创建消费者并将其 URL 保存到其他持久存储.此外,由于完全不受控制的故障(您没有机会进行清理)不应该是常见的情况,因此这样做通常不会给您带来太多好处。如果您真的需要从该故障中快速恢复,无论如何都可以显着减少您的应用程序的使用者实例超时。

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