Kafka 消息分发时间配置参数(Message Delivery Time)

本文详细解析了Kafka生产者send接口的工作流程,包括max.block.ms、delivery.timeout.ms、request.timeout.ms等关键参数的作用。讨论了linger.ms如何影响延迟与吞吐量,以及retries和retry.backoff.ms在错误处理和重试策略中的角色。通过理解这些参数,可以更好地优化Kafka生产者的消息发送性能。
摘要由CSDN通过智能技术生成

0 引言

本文是对Kafka Message Delivery Time的一个学习记录,方便后续回顾。

1 send接口时间

假设producer通过如下方式异步调用send接口

producer.send(record, new DemoProducerCallback());

那么调用send接口成功或者失败需要等待的时间由下图所示

具体的send()接口所经历的时间流如下图所示

上述阶段各个参数说明如下

max.block.ms:

该参数控制生产者在调用 send() 以及通过 partitionsFor() 显式请求元数据时将阻塞多长时间。 当生产者的发送缓冲区已满或元数据不可用时,这些方法会阻塞。当达到 max.block.ms 时,会抛出超时异常。

delivery.timout.ms:

该参数所配置的时间为 将从record准备好发送(send() 成功返回并且record被放置在batch中)到broker回response或producer放弃发送消息所花费的时间(包括重试所花费的时间)。

如果producer在重试期间超过了delivery.timeout.ms,将调用回调,并抛出与代理在重试之前返回的错误相对应的异常。 如果record batch仍在等待发送时超过了 delivery.timeout.ms,则将调用回调并出现超时异常。

request.timeout.ms:

该参数控制producer在发送数据时等待broker回复的时间。 注意,这是在放弃之前等待每个生产请求所花费的时间 - 它不包括重试、发送前所花费的时间等。如果达到超时而没有回复,生产者将重试发送或使用 TimeoutException 完成回调 .

retries 和 retry.backoff.ms:

当producer收到broker回复的错误消息时,错误可能是暂时的(例如,分区缺少领导者)。 在此场景,retries的值将控制producer在放弃并通知客户端问题之前重试发送消息的次数。 默认情况下,producer将在重试之间等待 100 ms,该参数由 retry.backoff.ms指定。

Producer进行重试是有条件限制的。 有些错误不是暂时的,不会导致重试(例如,“消息太大”错误)。

linger.ms:

linger.ms 控制在发送当前batch之前等待附加消息的时间间隔。 当当前batch已满或达到 linger.ms 限制时,KafkaProducer 会发送一批消息。 默认情况下,一旦有发送者线程可以发送消息,即使batch中只有一条消息也会被发送到broker。

通过将 linger.ms 设置为大于 0,也即生产者等待几毫秒以将其他消息添加到batch中,然后再将其发送到broker。 这会稍微增加延迟,但可以显著提高吞吐量 - 每条消息的开销要低得多,并且如果启用压缩,则提升的吞吐量更高。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qls315

感觉好可打赏几毛钱增强更新动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值