【发布时间】: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=all和ack=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