【问题标题】:In librdkafka, dr_cb() is called each time after produce() called在 librdkafka 中,每次调用 producer() 后都会调用 dr_cb()
【发布时间】:2015-07-17 15:31:51
【问题描述】:

我正在开发 C++ Kafka 客户端:librdkafka。库在这里https://github.com/edenhill/librdkafka/blob/master/examples/rdkafka_example.cpp。 每次调用Producer类中的produce(),是否调用了dr_cb()函数(见下面代码)?

/**
* Delivery Report callback class
*/
class DeliveryReportCb {
public:
virtual void dr_cb (Message &message) = 0;
};

【问题讨论】:

    标签: c++ apache-kafka


    【解决方案1】:

    发送报告回调 (dr_cb) 仅在应用程序在 Producer 句柄上调用 poll() 时调用,它们不会在 produce() 调用中调用。

    【讨论】:

    • 谢谢。当produce()被调用时,它会返回ErrorCode来表示成功或失败。 success 是否意味着消息已发送到 Kafka 服务器或仅意味着消息已发送到 out 队列?客户端有出队吗?
    • 我测试了我的程序。我产生了 234 条消息。 poll(0) 总共被调用了 234 次。 poll(1000) 被调用了 2 次。但是 dr_cb() 被调用了 234 次。看起来不对……
    • @ChengchengPeiproduce() 是一个异步 API,所以当 producer() 返回 Success 时,表示该消息已被接受并附加到内部队列,它将被最终传输到代理(取决于配置和网络状态)。因此,produce() 调用之后紧跟 poll() 调用很可能 NOT 为刚刚发送的消息触发 dr_cb(),因为它仍在内部队列中,它可能会服务于 dr_cb()对于任意数量现在已传递(或失败)的先前消息。
    • 谢谢。如何检查一条消息最终是否发送到代理?通过 outq_len() 检查出队列大小?
    • 如果消息在内部队列中,保证这条消息会发给broker吗?
    猜你喜欢
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2020-10-25
    • 2018-06-03
    • 2013-03-10
    • 2020-07-15
    • 2019-08-14
    相关资源
    最近更新 更多