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=all
和ack=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。
我开发了一个 Kafka version : 0.9.0.1
不能丢失任何消息的应用程序。
我有一个限制,即消息必须按正确的顺序使用。
为了确保我不会丢失任何消息,我在我的应用程序代码中实施了重试并将我的生产者配置为 ack=all
。
为了执行异常处理和快速失败,我立即 get()
从 Producer.send()
返回的 Future
,例如
final Future<RecordMetadata> futureRecordMetadata = KAFKA_PRODUCER.send(producerRecord);
futureRecordMetadata.get();
这种方法可以很好地保证所有消息的传递,但是性能是完全不能接受的。
例如 ack=all
.
当我注释掉 futureRecordMetadata.get() 时,我可以在 7 分钟内发送 1,089,125 条消息。
当我将ack=all
更改为ack=1
时,我可以在30分钟内发送815,038。为什么ack=all
和ack=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。