Apache Pulsar消息传递语义

问题描述 投票:0回答:1

我看了Apache Pulsar文档中的消息传递语义。如果不使用Apache函数,那么有哪些不同的传递语义可供选择?

queue message-queue apache-pulsar
1个回答
11
投票

TL;DR。 今天,无论是Pulsar Functions、Pulsar+Spark (你会看到重复的),也不是Pulsar+Flink (你会看到重复的)支持 有效的一次性语义 又名 正一语义. 只有在某些边缘情况下,你可以通过DIY设置手动实现这种语义。Pulsar目前支持的是:(1) 最多一次 语义=你可能会丢失数据,(2) 至少一次 语义=你不会丢失数据,但可能会看到重复的数据。

关于(3)有效的一次支持。我可以想象,你一定会感到困惑。尽管Pulsar文档中声称支持effective-once语义,并且有几篇关于这个主题的博客文章(不幸的是,具有误导性) (例子),实际上Pulsar并不支持这个。 Pulsar支持的是一个幂等的生产者和消息的重复数据删除。 这个功能确实是需要的,但是--这是很重要的方面--不需要。足够 的精确只读语义。 当前的功能只在产生一条消息并且只向一个分区发送时有效。 例如,你现在不能用 Pulsar 原子化地生成多个消息到一个分区,更不用说多个分区了。这也意味着,与状态的交互(例如,用于聚合数据,如计数,执行数据流之间的连接)并不是完全-once的。

缺少了什么,Pulsar何时才能支持exactly-once语义? 为了保证精确到一的语义,Pulsar必须首先添加对以下方面的支持。交易. 而这确实是一个计划中的功能,原定2020年6月发布的Pulsar 2.6.0的ETA,但到今天为止,还没有。任重道远. 我恐怕还不知道有更新的ETA。

哪里可以了解更多。 为了更详细地了解这个问题,一个很好的Pulsar特定来源是2019年12月的演讲。Apache Pulsar: 交易预览 Pulsar committers 的文章,它总结了当前缺乏精确的唯一性支持,并解释了为什么需要在 Pulsar 中支持事务来实现它。

另一个理解这个棘手问题的好来源是这篇由三部分组成的系列文章,它介绍了如何在Pulsar中提供exactly-once语义。Apache Kafka (博客系列 第一部分, 第二部分, 第三部分),这是一种类似于Apache Pulsar的技术。该系列解释了为什么幂等生产者只是其中的一部分,为什么需要事务(利用前者),以及如何在Apache Kafka中设计和实现,并在2017年发布。这就是为什么在Kafka中处理数据时,你会受益于exactly-once语义,例如 Kafka Streams (包含在Kafka中)或用 Kafka和Apache Flink. 如果你看看Pulsar在2020年引入精确的once支持的计划和路线图,你可以清楚地看到与Kafka的方法非常接近的相似之处。作为用户,显著的区别是Kafka一次性发布了所有功能(这也解释了为什么Kafka社区花了几年的时间来设计、构建和测试这个功能),而不是一件件地发布,这让我们更清楚地了解了什么是真正支持的与不支持的。

声明:我为 汇流,是为Apache Kafka做出贡献的公司之一。


3
投票

Pulsar提供了at-least-once语义。它还可以重复复制写到其日志中的数据(术语为idempotent production),并且可以使用和外部数据存储(与其他消息系统一样)来综合有效地-once消费。对于自给自足的effectiveexactly-once处理,例如要做流处理,你需要使用Kafka或Flink。


-2
投票

你可以实现你列出的所有消息传递语义,包括at-least once、at-most once和effective-once。

对于at-most once,你将使用一个专属订阅类型来确保只有消费者收到消息,并让你的消费者确认所有收到的消息,无论是否发生异常。

对于有效的一次,您将使用一个专属订阅类型来确保只有消费者收到消息,并且只有在您能够成功处理消息时才发送确认(即没有异常等),否则,您将消极地ACK消息以使其重新交付。

所有其他的行为组合都将属于至少一次交付保证。

https:/pulsar.apache.orgdocsen2.5.1concepts-messaging#consumers。

© www.soinside.com 2019 - 2024. All rights reserved.