【问题标题】:Does KafkaProducer onCompletion() callback always execute in the same thread?KafkaProducer onCompletion() 回调是否总是在同一个线程中执行?
【发布时间】:2017-04-11 14:56:52
【问题描述】:

Kafka API 0.10.1:Link

是否可以保证在同一个线程中按顺序调用 onCompletion 回调?文档说“请注意,回调通常会在生产者的 I/O 线程中执行”。所以我认为没有。

如果我想通过保持整数计数器来跟踪发生的异常数量,是否需要使用 AtomicInteger?

或者,如果我想保留一个布尔标志来跟踪是否在最后一次回调中发生了异常,我是否需要将其设为 volatile?

【问题讨论】:

    标签: apache-kafka kafka-producer-api


    【解决方案1】:

    是否可以保证在同一个线程中按顺序调用 onCompletion 回调?文档说“请注意,回调通常会在生产者的 I/O 线程中执行”。所以我认为没有。

    一般不会。例如,默认情况下有多个并行进行中的请求 - 它还取决于您的重试次数(默认为不重试)。

    如果我想通过保持整数计数器来跟踪发生的异常数量,是否需要使用 AtomicInteger?

    只有一个线程写入。所以严格来说没有。阅读线程可能会“错过”更新,但您稍后会阅读此更新。

    或者,如果我想保留一个布尔标志来跟踪是否在最后一次回调中发生了异常,我是否需要将其设为 volatile?

    可能会有所帮助。

    此外:您可以在主线程中“阻塞并等待”回调。

    有关详细信息,请参阅 http://docs.confluent.io/current/clients/producer.html#synchronous-writes

    【讨论】:

    • 所以你的意思是我应该删除回调,而是做 future.get() ?
    • 如果你想获得同步处理,是的。它当然会带来性能冲击。
    • 对,这应该是评论,没有答案。我不是在寻找替代方案,只是想检查我是否应该保持变量原子/易失性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多