我目前正在从netflix(https://www.slideshare.net/wangxia5/netflix-kafka)学习一些Kafka最佳实践。这是一个非常好的幻灯片。但是,我真的不明白其中一个关于生产者弹性配置的幻灯片(幻灯片18),我希望stackoverflow中的某个人非常友好地给我洞察力(无法找到视频或联系作者......)。
提到的幻灯片:失败但从未阻止生产者弹性配置。
Block.on.buffer.full=false
即使认为这是不赞成的配置,我想这个想法是让制作人马上失败而不是阻止等待。在最新的kafka配置中,我可以使用block.max.ms
的小值来使生产者无法发送消息而不是阻止它。
问题1:为什么我们要立即失败,是否意味着重试而不是阻止它?
Handle Potential Block for first meta data request
问题2:我可以理解消费者方面的元数据。即注册消费者群体和各种东西,但什么是生产者观点的元数据请求?它可能被阻止了吗?是否有任何kafka文档来描述
Periodically check whether Kafka producer was open successfully
问题3:我们是否可以检查该检查以及该检查有哪些好处?
提前致谢:)
答案 0 :(得分:4)
你必须记住卡夫卡制片人的工作方式:
来自API-Documentation:
生产者包含一个保存记录的缓冲区空间 尚未传输到服务器以及a 后台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
)。我不知道一些标准的方法来保持您的消费者的连接活着,甚至检查连接是否仍然存在。你可以做的是peridicaly向经纪人发送metadatarequest(producer.partitionsFor(anyTopic)
)。但同样可能这不是您的应用程序的问题。
(1)当谈到详细说明计算时间时所考虑的细节时,它会变得有点棘手。 max.block.ms
实际上是: