如何找出 librdkafka 库中确认的生产订单?
how to find out the produce order acked in the librdkafka library?
在 librdkafka 中,
数据已通过以下函数放入传输队列。
virtual ErrorCode produce (Topic *topic, int32_t partition, int msgflags, void *payload, size_t len, const void *key, size_t key_len, void *msg_opaque)
传输的结果可以在通过poll(0)注册为回调的dr_cb()中找到。
class ExampleDeliveryReportCb : public RdKafka::DeliveryReportCb {
public:
void dr_cb (RdKafka::Message &message) {
// I want to know the order of produce.
}
};
如果我生产10次,我怎么知道第三次生产是否成功?我可以看到实际消息或传输队列中剩余的消息数,但第三次产生的结果未知。
我想同步生成消息的序列号和通过dr_cb报告完成的消息的序列号。我该怎么办?
在 Kafka 中,排序只是每个分区的事情,如果您对多个分区进行生产,则这些分区之间没有排序。
至于生成到同一分区的消息,它们将按原始顺序生成,除非出现需要重试的错误,在这种情况下可以重新排序。
您可以设置 max.in.flight=1
以避免重新排序,不幸的是,这也会 降低吞吐量并增加延迟 ,或者使用 幂等生产者 与 enable.idempotence=true
以极低的吞吐量成本获得有保证的有序交付。
您可以使用 message opaque 将指针附加到 produce() 中的消息,您将在交付报告中以 msg_opaque
返回该消息,从而允许您将交付报告映射到您创建的原始对象生产。
在 librdkafka 中,
数据已通过以下函数放入传输队列。
virtual ErrorCode produce (Topic *topic, int32_t partition, int msgflags, void *payload, size_t len, const void *key, size_t key_len, void *msg_opaque)
传输的结果可以在通过poll(0)注册为回调的dr_cb()中找到。
class ExampleDeliveryReportCb : public RdKafka::DeliveryReportCb {
public:
void dr_cb (RdKafka::Message &message) {
// I want to know the order of produce.
}
};
如果我生产10次,我怎么知道第三次生产是否成功?我可以看到实际消息或传输队列中剩余的消息数,但第三次产生的结果未知。
我想同步生成消息的序列号和通过dr_cb报告完成的消息的序列号。我该怎么办?
在 Kafka 中,排序只是每个分区的事情,如果您对多个分区进行生产,则这些分区之间没有排序。
至于生成到同一分区的消息,它们将按原始顺序生成,除非出现需要重试的错误,在这种情况下可以重新排序。
您可以设置 max.in.flight=1
以避免重新排序,不幸的是,这也会 降低吞吐量并增加延迟 ,或者使用 幂等生产者 与 enable.idempotence=true
以极低的吞吐量成本获得有保证的有序交付。
您可以使用 message opaque 将指针附加到 produce() 中的消息,您将在交付报告中以 msg_opaque
返回该消息,从而允许您将交付报告映射到您创建的原始对象生产。