【问题标题】:how to re-send a failed message properly in librdkafka?如何在 librdkafka 中正确重新发送失败的消息?
【发布时间】:2020-01-16 10:08:01
【问题描述】:
static void DeliverCallback(rd_kafka_t *rk,  void *payload, size_t len, rd_kafka_resp_err_t error_code,  void *opaque, void *msg_opaque)
{
    if (error_code != RD_KAFKA_RESP_ERR_NO_ERROR)
    {
            // todo resend the message

    }
}

我的 dr_cb 是这样的。我知道如何获取发送失败消息的内容,但如何获取主题?最优雅的方法是什么?

【问题讨论】:

标签: c++ c apache-kafka librdkafka


【解决方案1】:

dr_cb 接口已过时且已弃用,您应该改用更丰富的dr_msg_cb,在该接口中您可以访问所有rd_kafka_message_t 字段,对于您的情况,该主题使用rkmessage->rkt

但是,您通常不应在交付报告中重新尝试生成失败消息,因为 librdkafka 将尽其所能在配置的约束(message.timeout.msretries)内生成消息,因此没有'通过再次重试相同的消息,应用程序可以增加很多价值。

改为配置message.timeout.ms 以满足您的业务需求,回答“尝试生成这段数据需要多长时间?”的问题,并将retries 设置为最大值(因为重试次数为从应用程序的角度来看无关紧要)。

如果重复或消息排序很关键,您还应该考虑使用幂等生产者 (enable.idempotence=true)。

最后,librdkafka 为每条已传递或失败的消息提供消息持久性指示器 API (rd_kafka_message_status()),让应用程序知道该消息是否...:

  • 绝对不持久
  • 可能持续存在(手动重试可能会导致重复)
  • 绝对坚持

有关 librdkafka 中消息可靠性的更多信息,请参阅 https://github.com/edenhill/librdkafka/blob/master/INTRODUCTION.md#message-reliability

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 2021-05-02
    相关资源
    最近更新 更多