Apache Kafka-了解poll()方法中作为参数出现的超时与fetch.max.wait.ms

时间:2018-05-12 01:37:16

标签: java apache-kafka

我想了解poll()方法中存在的超时与配置fetch.max.wait.ms之间的关系。所以,假设我有以下配置

          fetch.min.bytes= 50
          fetch.max.wait.ms= 400 ms
          timeout on poll method= 200 ms

所以,考虑我用上面指定的超时调用poll方法。 Consumer向Kafka Broker发送获取请求,Kafka Broker是该分区的领导者。 Broker根据配置fetch.min.bytes没有足够的字节发送,因此它将等待最多400毫秒来响应足够的数据到达。但是我已经配置了,轮询方法的超时为200毫秒,这是否意味着,当发送获取请求时,它只等待200毫秒服务器响应然后终止连接? / p>

这是怎么回事?在这种情况下,可以肯定地说,您总是将超时配置为 -

         timeout >= network latency + fetch.max.wait.ms

此外,Kafka Consumer是否主动获取记录?我的意思是,当用户代码忙于处理最后一次poll()方法调用的记录时,消费者正在忙着获取引擎盖后面的记录,以便在下次调用poll()时减少延迟。如果是,它如何维护这个内部缓冲区?我们还可以配置这个内部缓冲区的最大大小吗?

提前谢谢你。

1 个答案:

答案 0 :(得分:-1)

Time out on poll允许您进行异步处理。订阅一组主题后,消费者将在调用poll(long)时自动加入该组。 poll API旨在确保消费者的可用性。

只要消费者继续呼叫民意调查,消费者将留在群组中并继续从分配的分区接收消息。

在引擎盖下,消费者会定期向服务器发送心跳。如果消费者崩溃或无法在session.timeout.ms的持续时间内发送心跳,则消费者将被视为死亡,并且其分区将被重新分配。

但我们应该注意poll(long)中的长值不会太长。这使整个过程同步。您可以阅读以下链接中的讨论。

https://github.com/confluentinc/confluent-kafka-dotnet/issues/142

fetch.max.wait.ms这将确保每当创建获取请求时,服务器将阻止请求直到指定的时间。如果没有足够的数据立即满足fetch.min.bytes给出的要求,通常会启动。

第1点:当有获取请求时,如果服务器不满足50字节,则会阻止您的获取请求400毫秒。

fetch.min.bytes= 50
fetch.max.wait.ms= 400 ms

第2点:对于每200毫秒,您的消费者会发送心跳以避免被kafka重新平衡。

轮询方法超时= 200毫秒

当点1发生时,您的消费者处于空闲状态,但由于您点2点,每200毫秒发送心跳,因此不会发生重新平衡,您可能会在接下来的200毫秒内异步执行某些任务。

因此设置poll()只会确保您的使用者不被认为是死的,而fetch.max.wait.ms则告诉服务器在获取请求时需要等待多长时间。我的意思是说这两个参数没有固有的依赖性。 poll()更像是在代码中执行异步的方式。

超时完全基于民意调查()。