我目前正在从netflix(https://www.slideshare.net/wangxia5/netflix-kafka)学习一些Kafka最佳实践。这是一张很好的幻灯片。但是,我真的不理解其中提到的有关生产者弹性配置的一张幻灯片(幻灯片18),我希望stackoverflow中的某个人非常乐意为我提供相关信息(不能找到视频或联系作者...)。
幻灯片提到:失败,但从不阻止生产者弹性配置。
Block.on.buffer.full=false
Run Code Online (Sandbox Code Playgroud)
即使以为这是已弃用的配置,我想的想法是让生产者立即失败而不是阻塞等待。在最新的kafka配置中,我可以使用一个较小的值block.max.ms来使生产者无法发送消息而不是阻止消息。
问题1:为什么我们要立即失败,是否意味着以后重试而不是阻止它?
Handle Potential Block for first meta data request
Run Code Online (Sandbox Code Playgroud)
问题2:我可以了解用户端的元数据。即注册消费者组和东西,但是从生产者的角度来看元数据请求是什么?并且它可能被阻止了吗?是否有任何kafka文档来描述
Periodically check whether Kafka producer was open successfully
Run Code Online (Sandbox Code Playgroud)
问题3:有没有一种方法可以检查该检查以及该检查有什么好处?
提前致谢 :)
您必须记住kafka生产者的工作方式:
从API文档中:
生产者由一个缓冲空间池和一个I / O后台线程组成,该缓冲池保存尚未传输到服务器的记录,该I / O线程负责将这些记录转换为请求并将它们传输到集群。
如果调用将send记录发送到代理的方法,则此消息将添加到内部缓冲区(可以使用buffer.memory配置属性来配置此缓冲区的大小)。现在可能发生不同的事情:
max.block.ms(替代block.on.buffer.full)设置为正值,发送消息将在此时间量(1)内阻止,并在之后发生超时异常。 关于您的问题:(1)如果我看对幻灯片,Netflix明确希望丢弃无法发送给代理的消息(而不是阻止,重试,失败...)。当然,这很大程度上取决于您的应用程序和要处理的消息类型。如果它只是记录消息,那可能没什么大不了的。如果涉及金融交易,您可能需要
(2)生产者需要一些有关集群的元数据。例如,它需要知道哪个密钥进入哪个分区。hortonworks有一篇不错的博客文章,说明生产者如何进行内部工作。我认为值得一读:https : //community.hortonworks.com/articles/72429/how-kafka-producer-work-internally.html
此外,声明:
据我所知,针对第一个元数据请求的处理潜力块指出了一个问题。发送的第一个调用将进行同步。向代理发送元数据请求,因此可能需要更长的时间。
(3)如果生产者闲置了一段时间(请参阅参考资料connections.max.idle.ms),则代理将关闭与生产者的连接。我不知道有什么标准方法可以保持您的使用者的连接处于活动状态,甚至无法检查连接是否仍处于活动状态。您可以做的是定期向代理(producer.partitionsFor(anyTopic))发送元数据请求。但这又不是您的应用程序遇到的问题。
(1)当涉及到细节时,计算经过的时间要考虑什么,这有点棘手。因为max.block.ms实际上是:
| 归档时间: |
|
| 查看次数: |
675 次 |
| 最近记录: |