我想了解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()时减少延迟。如果是,它如何维护这个内部缓冲区?我们还可以配置这个内部缓冲区的最大大小吗?
提前谢谢你。
答案 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()更像是在代码中执行异步的方式。
超时完全基于民意调查()。