【发布时间】:2017-12-05 11:34:55
【问题描述】:
我正在实现一个基于 kafka 的应用程序,我想手动确认传入的消息。建筑迫使我在一个单独的线程中完成它。
问题是:在与消费者不同的线程中执行 Acknowledgement.acknowledge() 是否可能且安全?
【问题讨论】:
标签: spring apache-kafka spring-kafka
我正在实现一个基于 kafka 的应用程序,我想手动确认传入的消息。建筑迫使我在一个单独的线程中完成它。
问题是:在与消费者不同的线程中执行 Acknowledgement.acknowledge() 是否可能且安全?
【问题讨论】:
标签: spring apache-kafka spring-kafka
是的,只要你使用MANUAL 而不是MANUAL_IMMEDIATE,但我认为你不会得到你所期望的。
Kafka 不跟踪每条消息,只跟踪分区内的偏移量。
假设消息 1 到达,您将其移交给另一个线程。然后消息 2 到达,它被移交给另一个线程。
当消息 2 的偏移量被确认时,您实际上是在确认两条消息。
【讨论】:
Acknowledgement.acknowledge 在MANUAL ack-mode 中调用方法addOffset。此方法与 HashMap 字段offsets 交互:检查键是否存在,将值放入其中。它怎么可能是线程安全的?