本篇针对Pulsar的相关特性进行介绍。
为什么选择Pulsar
-
是下一代云原生分布式消息流平台。
-
Pulsar 的单个实例原生支持多个集群,可
跨机房在集群间无缝地完成消息复制。 -
极低的发布延迟和端到端延迟。
-
可扩展到超过一百万个 topic。
-
简单的客户端 API,支持 Java、Go、Python 和 C++。
-
主题
多种订阅模式(独占、共享和故障转移)。 -
通过 Apache BookKeeper 提供的持久化消息存储机制保证消息传递 。
-
由轻量级的 serverless 计算框架 Pulsar Functions 实现流原生的数据处理。
-
基于 Pulsar Functions 的 serverless connector 框架 Pulsar IO 使得数据更易移入、移出 Apache Pulsar。
-
分层式存储可在数据陈旧时,将数据从热存储卸载到冷/长期存储(如S3、GCS)中。
关于消息、BookKeeper相关特性以及分层存储等知识前面已经介绍过,这里不详细就不详细展开了。
1.多种订阅类型
pulsar中有四种订阅类型:exclusive、shared、failover和key_shared。这些类型如下图所示。
1.1 exclusive(独占模式)
独占模式,只能有一个Consumer绑定到订阅上。如果多于一个Consumer尝试以使用相同的订阅订阅Topic,就会抛出异常且无法连接。
独占模式的使用场景是: 当需要保证每个消息只被一个已知的使用者处理一次时,可以使用此模式。
1.2 failover(灾备模式)
在灾备订阅模式中,多个Consumer可以绑定到同一个订阅上, Consumer将会按字典顺序排序,第一个Consumer被初始化为唯一接受消息的消费者,被称为Master Consumer。 当Master Consumer断开时,所有的未被确认和后续进入的消息将会被投递给下一个Consumer。
这里有两种场景:
- Partitioned topics
- Non-partitioned topics
如果是一个有分区的topic,broker会尝试将分区均匀分配给优先级较高的consumer
如果是一个未分区的topic,broker会顺序挑选一个consumer进行消费。
灾备模式的使用场景是: 当需要单一处理语义和使用者的高可用性时,这种类型的订阅非常有用。例如如果希望消费者服务在发生系统故障时继续处理消息,即希望在第一个消费者服务实例因任何原因而失败时由另一个消费者服务实例接管。
1.3 shared(共享模式)
在共享模式中,多个Consumer可以绑定到同一个订阅上。 消息通过round robin轮询机制分发给不同的消费者,并且每个消息仅会被分发给一个消费者。 当一个消费者断开连接时,所有已经投递给它但还没有被确认的消息将被重新投递,分发给其它存活的消费者。
使用共享模式有以下两个限制:
- 消息的顺序无法保证
- 不可以使用累积确认(cumulative ack)
1.4 key-shared(基于key的共享模式)
key-shared模式是共享模式的一种特例,它也允许多个Consumer可以绑定到同一个订阅上,与共享模式中的round robin轮询消费消息不同,key-shared模式增加了一个辅助key,确保具有相同key的消息被交付给相同的消费者。即具有相同key的消息被分组在一起,交付给相同的消费者。
2.跨地域复制
Geo Replication是pulsar内置的功能,配置灵活,不需要额外部署插件,使用成本较低。
如图,有三个 Apache Pulsar 集群,分布于北京、上海和广州,用户创建的一个 Topic T1 设置了跨越三个数据中心做互备。在三个数据中心中,分别有三个生产者:P1、P2、P3,它们往主题 T1 中发布消息;有两个消费者:C1、C2,订阅了这个主题,接收主题中的消息。当消息由本数据中心的生产者发布成功后,会立即复制到其他两个数据中心。消息复制完成后,消费者不仅可以收到本数据中心产生的消息,也可以收到从其他数据中心复制过来的消息。
3. 多租户与鉴权
property 代表的是租户名(tenant),它是一个资源的隔离单位,一个 tenant 下可以有多个 namespace。namespace 是 Pulsar 中租户的基本管理单元 用来管理其下面所属的 topics,可以在 namespace 级别给 topic 设置相应的策略,比如 retention,backlog,ratelimit。一个 namespace 下又可以有多个 topic,他们的权限大小也是由上到下。Pulsar 的多租户通过 tenant、namespace、topic 形成多级管理系统。
在 Pulsar 中,当客户端连接到Broker时,Broker使用身份验证插件来建立该客户端的身份,验证成功后为该客户端分配Role Token。此Role Token是一个字符串,例如 property-1-admin 或 property-2-admin,可以表示单个客户端或多个客户端。Role Token用于控制Namespace或Topic上,生产、消费消息或function的权限(ACL),无论是授权还是鉴权都支持自己定义的实现。
4.Pulsar IO(Connector)连接器
-
Pulsar IO 分为输入(Input)和输出(Output)两个模块,输入代表数据从哪里来,通过
Source实现数据输入。输出代表数据要往哪里去,通过Sink实现数据输出。 -
Pulsar 提出了 IO (也称为 Pulsar Connector),用于解决 Pulsar 与周边系统的集成问题,帮助用户高效完成工作。
-
目前 Pulsar IO 支持非常多的连接集成操作:例如 HDFS、Spark、Flink、Flume、ES、HBase等。
5.Pulsar Functions(轻量级计算框架)
Pulsar Functions 是一个轻量级的计算框架,可以给用户提供一个部署简单、运维简单、API 简单的 FASS(Function as a service)平台。Pulsar Functions 提供基于事件的服务,支持有状态与无状态的多语言计算,是对复杂的大数据处理框架的有力补充。
Pulsar Functions 的设计灵感来自于 Apache Storm、Apache Heron、Apache Flink 这样的流处理引擎,Pulsar Functions 将会拓展 Pulsar 和整个消息领域的未来。使用 Pulsar Functions,用户可以轻松地部署和管理 function,通过 function 从 Pulsar topic 读取数据或者生产新数据到 Pulsar topic。
每当一个函数接收到一条消息时,它会完成以下的consume-apply-publish步骤:
- 从一个或多个
input topic中消费消息。 - 将自定义的(用户提供的)处理逻辑应用于消息。
- 发布消息到
out topic,包括:
- 将输出消息写入Pulsar中的
out topic。 - 将日志写入
log topic(如果配置了)以进行调试。 - 将状态更新写入
BookKeeper(如果配置了)。
您可以使用Java、Python和Go编写函数。例如,您可以使用Pulsar Functions设置以下处理链:
- 一个Python函数监听原始句子主题(raw-sentences topic),对接收到的字符串进行"清理"(去除多余的空格并将所有字符转换为小写),然后将结果发布到经过清理的句子主题(sanitized-sentences topic)。
- 一个Java函数监听经过清理的句子主题(sanitized-sentences topic),在指定的时间窗口内计算每个单词出现的次数,并将结果发布到结果主题(results topic)。
- 一个Python函数监听结果主题(results topic),并将结果写入MySQL表格。
有关更多详细信息,请参阅Develop Pulsar Functions