apache-kafka - 如何找出 librdkafka 库中确认的生产订单?
问题描述
在 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
避免排序,不幸的是这也会降低吞吐量并增加延迟,或者使用即将推出的 Idempotent Producer(仅在主分支上直到下一个版本)以enable.idempotence=true
非常低的吞吐量成本获得有保证的有序交付。
您可以使用不透明的消息将指针附加到生产()中的消息,您将msg_opaque
在交付报告中返回该消息,从而允许您将交付报告映射到您生成的原始对象。
推荐阅读
- sql - SQL Server - 将计算应用于各种列的嵌套 SELECT
- ruby-on-rails - 如何使用 rake 任务将图像保存在 Google 存储桶中
- javascript - 如何拉出嵌套 JS 对象中的关系?
- android - 片段管理android
- javascript - Reactjs:无法访问无状态组件中的道具值
- linux - 可以调用文件 core.foo 吗?
- apache - Apache Rewrite Rule 服务器配置问题
- c - “计数字符”程序:While 循环未在 EOF 上终止
- variables - 在 Nginx request_uri 中使用多个变量
- python - 从文件中读取字典后打印多个值