如何提高Kafka生产者的性能时,使用同步模式

kd3sttzy  于 2021-06-08  发布在  Kafka
关注(0)|答案(1)|浏览(496)

我已经开发了一个 Kafka version : 0.9.0.1 不能丢失任何消息的应用程序。
我有一个约束,即消息必须按正确的顺序使用。
为了确保不丢失任何消息,我在应用程序代码中实现了重试,并将生产者配置为 ack=all .
为了执行异常处理并快速失败,我立即 get() 返回时 FutureProducer.send() ,例如。

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

这种方法可以很好地保证所有消息的传递,但是性能是完全不可接受的。
例如,发送152125条消息需要34分钟 ack=all .
当我注解掉futurerecordmetadata.get()时,我可以在7分钟内发送1089125条消息。
当我改变的时候 ack=allack=1 我可以在30分钟内发送815038。为什么两者之间有这么大的区别 ack=all 以及 ack=1 ?
但是,通过不阻塞 get() 我不知道消息是否安全到达。
我知道我能通过考试 Callback 但是,这种方法有一个缺点,即消息可能被无序地消耗。
我想 request.required.acks config可以为我保存一天,但是当我为它设置任何值时,我会收到这个警告

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
我是否可以直接从主题中使用Kafka消息键顺序的消息?
或者我必须按偏移顺序使用消息,然后按kafka消息键顺序编程排序?

unftdfkk

unftdfkk1#

如果您期望总订单,则发送性能很差(实际上,总订单情况非常罕见)。
如果分区顺序可以接受,那么可以使用多线程生成器。每个分区一个生产者/线程。

相关问题