Apache kafka Kafka Rest代理使用者创建

Apache kafka Kafka Rest代理使用者创建,apache-kafka,kafka-consumer-api,Apache Kafka,Kafka Consumer Api,假设我有一个服务,它通过kafka rest代理使用消息,并且始终在同一消费者组上。我们也可以说,它是在一个有一个分区的主题上使用的。当服务启动时,它会在kafka rest proxy中创建一个新的使用者,并使用生成的使用者url,直到服务关闭。当服务返回时,它将在kafka rest proxy中创建一个新的使用者,并使用新的url(和新的使用者)进行消费 我的问题 因为kafka每个分区最多只能有一个使用者。当使用者重新启动时,kafka和kafka rest代理中会发生什么?i、 e.在

假设我有一个服务,它通过kafka rest代理使用消息,并且始终在同一消费者组上。我们也可以说,它是在一个有一个分区的主题上使用的。当服务启动时,它会在kafka rest proxy中创建一个新的使用者,并使用生成的使用者url,直到服务关闭。当服务返回时,它将在kafka rest proxy中创建一个新的使用者,并使用新的url(和新的使用者)进行消费

我的问题

  • 因为kafka每个分区最多只能有一个使用者。当使用者重新启动时,kafka和kafka rest代理中会发生什么?i、 e.在kafka rest proxy中创建了一个新的消费者,但旧的消费者没有被销毁的机会。因此,在kafka rest proxy中“n”重新启动我的服务后,现在有“n”个消费者,但只有其中一个消费者正在积极消费。我甚至可以在我的新消费者上消费消息,因为消费者比分区多吗

  • 让我们把这个问题弄得更复杂一些,假设我的服务在同一消费者组上有5个实例,主题中有5个分区。在“n”重新启动我的服务的所有5个实例之后,我甚至可以保证在不确保正确销毁现有使用者的情况下使用所有消息。i、 e.当使用者超出分区数量时,Kafka和Kafka rest代理在使用者创建期间做什么

  • 什么被认为是卡夫卡rest代理的最佳实践,以确保始终清理过时的消费者?您是否建议保留消费者url?我是否应该强制重新启动kafka rest代理,以确保在启动服务之前销毁现有使用者

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

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

  • 如果您无法完全关闭使用者,它将在向其发出最后一个请求后的一段时间内保持活动状态。代理将针对这种情况对过时的使用者进行垃圾收集——如果它没有完全关闭,使用者将无限期地保留某些分区。通过自动对消费者进行垃圾收集,您不需要一些单独的持久存储来跟踪消费者实例。正如您所发现的,您可以通过config
    consumer.instance.timeout.ms
    控制此超时

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

  • 理想情况下,不干净地关闭你的应用程序是很少见的,所以最好的做法就是在你的应用程序关闭时清理消费者。即使在特殊情况下,您也可以使用
    try
    /
    catch
    /
    finally
    块来销毁消费者。如果一个人活着,他最终会康复的。除此之外,考虑Time> Cuffuff.Simult.TimeOut.MS设置要低一些,如果应用程序可以容忍的话。它只需要大于使用使用者的调用之间的最长周期(并且您应该记住可能的错误情况,例如,如果处理消息需要与另一个系统交互,并且该系统可能变得缓慢/不可访问,则在设置此配置时应对此进行说明)

  • 您可以持久化URL,但即使这样,也可能会丢失对使用者的跟踪,因为您无法以原子方式创建使用者并将其URL保存到其他持久性存储中。此外,由于完全不受控制的故障(您没有机会清理)不应该是常见的情况,因此这样做通常不会给您带来多大好处。如果您需要从该故障中快速恢复,应用程序的使用者实例超时可能会显著减少

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