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。 这会稍微增加延迟,但可以显著提高吞吐量 - 每条消息的开销要低得多,并且如果启用压缩,则提升的吞吐量更高。