我浏览了 Apache Pulsar Documentation for Message Delivery Semantics。Apache函数提到的交付语义(至少一次,最多一次和一次有效),如果我们不使用Apache函数,那么有哪些不同的交付语义可用?
3 回答
TL;DR:今天,Pulsar Functions、Pulsar+Spark(你会看到重复)和 Pulsar+Flink(你会看到重复)都不支持有效的一次语义,也就是精确一次语义。只有在某些边缘情况下,您才能通过 DIY 设置手动实现此类语义。Pulsar 今天支持的是 (1) at-most-once语义 = 你可能会丢失数据和 (2) at-least-once语义 = 你不会丢失数据但可能会看到重复。
关于(3)一次有效的支持:我当然可以想象你一直很困惑。尽管 Pulsar 文档中声称支持有效的一次性语义,并且有几篇(不幸的是,误导性的)关于该主题的博客文章(示例),但 Pulsar 实际上并不支持这一点。Pulsar 支持的是幂等生产者和消息的重复数据删除。这个功能确实是必需的,但是——这是重要的方面——还不够对于一次性语义。当前功能仅在生成一条消息且仅针对一个分区时才有效。例如,您现在无法使用 Pulsar 原子地向一个分区生成多条消息,更不用说多个分区了。这也意味着与状态的交互(例如,用于聚合数据,如计数,在数据流之间执行连接)不是一次性的。
缺少什么,Pulsar 什么时候支持完全一次性语义?为了保证完全一次的语义,Pulsar 必须首先添加对事务的支持。这确实是 2020 年 6 月发布的 Pulsar 2.6.0 原始 ETA 的计划功能,但截至今天仍有很多工作要做。恐怕我不知道更新的 ETA。
在哪里了解更多信息:一个很好的 Pulsar 特定来源可以更详细地理解这一点,这是 2019 年 12 月的演示Apache Pulsar:Pulsar 提交者的交易预览,它总结了当前缺乏完全一次支持的情况,并解释了为什么需要支持 Pulsar 中的事务实现它。
另一个总体上理解这个棘手主题的好来源是这篇由 3 部分组成的文章系列,介绍了Apache Kafka如何提供一次性语义(博客系列part1、part2、part3),这是一种类似于 Apache Pulsar 的技术。该系列解释了为什么幂等生产者只是难题的一部分,为什么需要事务(利用前者),以及如何在 Apache Kafka 中设计和实现它,并于 2017 年发布。这就是为什么您可以从确切中受益 -使用Kafka Streams(包含在 Kafka 中)或使用Kafka 和 Apache Flink在Kafka 中处理数据时的一次语义. 如果您查看 Pulsar 在 2020 年引入精确一次性支持的计划和路线图,您可以清楚地看到与 Kafka 的方法非常相似。作为用户,显着的区别在于 Kafka 一次性发布了所有功能(这也解释了为什么 Kafka 社区需要花费数年时间来设计、构建和测试该功能),而不是逐个发布,更清楚地了解实际支持的内容与不支持的内容。
免责声明:我在Confluent工作,这是为 Apache Kafka 做出贡献的公司之一。
Pulsar 提供至少一次语义。它还可以删除对其日志的重复写入(称为幂等生产),并且可以使用外部数据存储(与其他消息传递系统一样)有效地合成消费。对于自给自足的有效/精确一次处理,例如进行流处理,您需要使用 Kafka 或 Flink。
您可以实现您列出的所有消息传递语义,包括至少一次、最多一次和有效一次。
最多一次,您将使用独占订阅类型来确保只有消费者获取消息,并让您的消费者确认它收到的所有消息,无论是否发生异常。
对于一次有效,您将使用独占订阅类型来确保只有消费者才能获取消息,并且仅在您能够成功处理消息(即没有异常等)时发送确认,否则,您将否定确认消息让它重新交付。
所有其他行为组合都属于至少一次交付保证。
https://pulsar.apache.org/docs/en/2.5.1/concepts-messaging/#consumers