Bal*_*ath 2 queue message-queue apache-pulsar
我浏览了消息传递语义的 Apache Pulsar 文档。Apache 函数提到的交付语义(至少一次,最多一次和有效一次),如果我们不使用 Apache 函数,那么可用的所有不同交付语义是什么?
Mic*_*oll 13
TL;DR:今天,Pulsar Functions、Pulsar+Spark(你会看到重复)和 Pulsar+Flink(你会看到重复)都没有有效地支持一次性语义,也就是恰好一次语义。只有在某些边缘情况下,您才能通过 DIY 设置手动实现此类语义。Pulsar 目前支持的是 (1)至多一次语义 = 您可能会丢失数据和 (2)至少一次语义 = 您不会丢失数据但可能会看到重复数据。
关于(3)有效-一次支持:我当然可以想象你已经糊涂了。尽管 Pulsar 文档中声称支持有效一次语义,并且有几篇(不幸的是,具有误导性)关于该主题的博客文章(示例),但 Pulsar 实际上并不支持这一点。Pulsar 支持的是消息的幂等生产者和重复数据删除。这个功能确实是必需的,但是——这是重要的方面——还不够对于恰好一次语义。当前功能仅在生成一条消息且仅针对一个分区时有效。例如,如今您无法使用 Pulsar 原子地向一个分区生成多条消息,更不用说多个分区了。这也意味着与状态的交互(例如,聚合数据,如计数,在数据流之间执行连接)不是完全一次。
缺少什么,Pulsar 什么时候支持恰好一次语义?为了保证一次性语义,Pulsar 必须首先添加对事务的支持。这确实是一个计划中的功能,2020 年 6 月发布了 Pulsar 2.6.0 的原始 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 做出贡献的公司之一。