【问题标题】:Kafka producer resilience config: Fail but never blockKafka生产者弹性配置:失败但从不阻塞
【发布时间】:2018-01-24 15:19:13
【问题描述】:

我目前正在从 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:我们有什么方法可以检查,检查有什么好处?

提前致谢:)

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    您必须牢记 kafka 生产者的工作方式:

    来自 API 文档:

    生产者由一个保存记录的缓冲空间池组成 尚未传输到服务器以及 负责翻转这些记录的后台 I/O 线程 进入请求并将它们传输到集群。

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

    1. 快乐路径:来自缓冲区的消息将被后台 I/O 线程转换为对代理的请求,代理将 ACK 这条消息,一切都会好起来的。
    2. 无法将消息发送到 kafka 代理(与代理的连接中断,您生成消息的速度超过了它们可以发送的速度等)。在这种情况下,由您决定要做什么。将max.block.ms(作为block.on.buffer.full 的替代品)设置为正值,发送消息将阻塞这段时间(1),然后通过超时异常。

    关于您的问题: (1) 如果我的幻灯片正确,Netflix 明确希望丢弃他们无法发送给代理的消息(而不是阻止、重试、失败......)。这当然在很大程度上取决于您的应用程序和您正在处理的消息类型。如果它“只是记录消息”,那可能没什么大不了的。如果涉及金融交易,您可能需要

    (2) 生产者需要一些关于集群的元数据。例如。它需要知道哪个键进入哪个分区。 hortonworks 有一篇很好的博客文章,制作人如何在内部工作。我觉得值得一读:https://community.hortonworks.com/articles/72429/how-kafka-producer-work-internally.html

    进一步声明:

    处理第一个元数据请求的潜在块 指出据我所知仍然存在的问题。第一次调用 send 将进行同步。向代理请求元数据,因此可能需要更长时间。

    (3) 如果生产者空闲一段时间,代理将关闭与生产者的连接(请参阅connections.max.idle.ms)。我不知道有什么标准方法可以让您的消费者保持连接状态,甚至检查连接是否仍然有效。您可以做的是定期向代理 (producer.partitionsFor(anyTopic)) 发送元数据请求。但也许这对您的应用程序来说不是问题。


    (1) 当涉及到计算经过的时间时要考虑的细节时,它有点棘手。对于max.block.ms,实际上是:

    • 元数据提取时间
    • 缓冲全块时间
    • 序列化时间(自定义序列化器)
    • 分区时间(自定义分区器)

    【讨论】:

    • 为答案点赞,感谢您提供有关问题的见解。问题1和2对我来说很有意义。对于问题 3 监控生产者已成功打开,我仍然不确定定期检查有什么好处。如果连接关闭,是否意味着生产者将发送另一轮元数据请求?这意味着阻塞一点?我对此有点困惑。
    • @Cloudtech - 我想(避免冷启动问题)是有道理的。但我不是这张幻灯片的作者,因此不能 100% 确定。
    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2017-06-09
    • 2017-09-14
    • 1970-01-01
    相关资源
    最近更新 更多