Kafka Producer同步模式下如何提升性能

How to Improve Performance of Kafka Producer when used in Synchronous Mode

我开发了一个 Kafka version : 0.9.0.1 不能丢失任何消息的应用程序。

我有一个限制,即消息必须按正确的顺序使用。

为了确保我不会丢失任何消息,我在我的应用程序代码中实施了重试并将我的生产者配置为 ack=all

为了执行异常处理和快速失败,我立即 get()Producer.send() 返回的 Future,例如

final Future<RecordMetadata> futureRecordMetadata = KAFKA_PRODUCER.send(producerRecord);
futureRecordMetadata.get();

这种方法可以很好地保证所有消息的传递,但是性能是完全不能接受的。

例如 ack=all.

发送 152,125 条消息需要 34 分钟

当我注释掉 futureRecordMetadata.get() 时,我可以在 7 分钟内发送 1,089,125 条消息。

当我将ack=all更改为ack=1时,我可以在30分钟内发送815,038。为什么ack=allack=1有这么大的区别?

但是,如果不阻塞 get(),我无法知道消息是否安全到达。

我知道我可以将 Callback 传递给发送并让 Kafka 为我重试,但是这种方法有一个缺点,即消息可能会乱序使用。

我认为 request.required.acks 配置可以为我节省一天时间,但是当我为其设置任何值时,我收到此警告

130 [NamedConnector-Monitor] WARN org.apache.kafka.clients.producer.ProducerConfig - The configuration request.required.acks = -1 was supplied but isn't a known config.

是否可以异步发送 Kafka 消息,并保证它们始终以正确的顺序安全到达?

更新 001

有没有办法直接从TOPIC消费kafka消息KEY命令中的消息?

或者我必须按偏移顺序使用消息然后以编程方式排序 给 Kafka 消息 Key order?

如果您期望总订单,则发送性能很差。 (其实全单场景是很少见的)
如果分区顺序是可以接受的,你可以使用多线程生产者。每个分区一个 producer/thread。