Kafka生产者弹性配置:失败但永远不会阻止

时间:2018-01-24 06:02:11

标签: apache-kafka

我目前正在从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:我们是否可以检查该检查以及该检查有哪些好处?

提前致谢:)

1 个答案:

答案 0 :(得分:4)

你必须记住卡夫卡制片人的工作方式:

来自API-Documentation:

  

生产者包含一个保存记录的缓冲区空间   尚未传输到服务器以及a   后台I / O线程负责转换这些记录   进入请求并将其传输到集群。

如果调用send方法向记录发送记录,则此消息将添加到内部缓冲区(可以使用buffer.memory配置属性配置此缓冲区的大小)。现在可能会发生不同的事情:

  1. 快乐路径:来自缓冲区的消息将被后台I / O线程转换为对代理的请求,代理将确认此消息,一切都会好的。
  2. 无法将消息发送到kafka代理(与代理的连接中断,您生成的消息比发送的更快,等等)。在这种情况下,由您决定做什么。将max.block.ms(作为block.on.buffer.full的替代)设置为正值,发送消息将阻塞此时间量(1)并在之后通过超时异常。
  3. 关于你的问题: (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实际上是:

    • 元数据获取时间
    • 缓冲区完全阻止时间
    • 序列化时间(自定义序列化程序)
    • 分区时间(自定义分区程序)