【发布时间】:2020-01-20 10:37:48
【问题描述】:
有一个包含 80 到 100 条记录的 ArrayList,尝试将每个单独的记录(POJO,不是整个列表)流式传输并发送到 Kafka 主题(事件中心)。每隔一小时安排一次 cron 作业,将这些记录 (POJO) 发送到事件中心。
能够看到正在发送到 eventthub 的消息,但是在成功运行 3 到 4 次后出现以下异常(其中包括正在发送的几条消息和几条失败并出现以下异常)
Expiring 14 record(s) for eventhubname: 30125 ms has passed since batch creation plus linger time
以下是使用的 Producer 的配置,
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.ACKS_CONFIG, "1");
props.put(ProducerConfig.RETRIES_CONFIG, "3");
消息保留期 - 7
分区 - 6
使用 spring Kafka(2.2.3) 发送事件
方法标记为@Async,其中写有kafka send
@Async
protected void send() {
kafkatemplate.send(record);
}
预期 - 不会从 kafka 抛出异常 实际 - org.apache.kafka.common.errors.TimeoutException 被抛出
【问题讨论】:
-
错误是说你还没有填充生产者的批量大小(记录不会立即发送)。您可以减少生产者配置中的批量大小或定期自行刷新生产者
-
非常感谢@cricket_007 的回复,因为默认尺寸是 16384,您会推荐什么尺寸
-
您的 80-100 条记录的总和是否大于 1.6 MB?
-
它将接近 150-200 kb @cricket_007
-
糟糕,我的意思是 1.6 Kb 以上。好的,所以在低端,
150000/16384大约是 9 个批次,默认情况下,还有一些剩余。您需要调整该值,以便在未发送的批次中没有剩余数据
标签: java spring-boot apache-kafka azure-eventhub