【问题标题】:How to Improve Performance of Kafka Producer when used in Synchronous Mode在同步模式下使用时如何提高 Kafka Producer 的性能
【发布时间】:2016-08-24 13:26:32
【问题描述】:

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

我有一个约束,即消息必须以正确的顺序使用。

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

为了强制执行异常处理并快速失败,我立即在从 Producer.send() 返回的 Future 上使用 get(),例如

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 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

无论如何我可以直接从 TOPIC 消费 kafka message KEY order 中的消息吗?

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

【问题讨论】:

    标签: asynchronous apache-kafka kafka-producer-api


    【解决方案1】:

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

    【讨论】:

    • 我们只能使用一个分区,因为这是我们保证发送顺序的方式
    • 您正在处理什么样的数据?数据库二进制日志?
    • DBMS 插入、更新和删除行前后的数据库。这就是为什么我的消息必须以正确的顺序保存
    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 2020-12-17
    • 1970-01-01
    • 2014-09-09
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    相关资源
    最近更新 更多