(图片来自:https://pulsar.apache.org)
1 初识Pulsar
简介:
- Pulsar是由Java语言进行编写的新一代消息队列产品,具有多租户、高性能等优势。
- Pulsar 最初由 Yahoo 开发,目前由 Apache 软件基金会管理。
关键特性:
- Pulsar 的单个实例原生支持多个集群,可跨机房在集群间无缝地完成消息复制。
- 极低的发布延迟和端到端延迟。
- 可无缝扩展到超过一百万个 topic和topic的多种订阅模式。
- 通过 Apache BookKeeper提供的持久化消息存储机制保证消息传递 。
- 由轻量级的 serverless 计算框架 Pulsar Functions 实现流原生的数据处理。
- 基于 Pulsar Functions 的 serverless connector 框架 Pulsar IO 使得数据更易移入、移出 Apache Pulsar。
- 分层式存储可在数据陈旧时,将数据从热存储卸载到冷/长期存储(如S3、GCS)中。
2 基本概念
2.1 基本概念
2.1.1 设计模式
Pulsar 采用经典的发布-订阅的设计模式(简称 pub-sub),在这个模式中,生产者向主题发布消息; 使用者订阅这些主题,处理传入消息,并在处理完成时向代理发送确认。
一旦创建订阅,即使 consumer 断开连接,Pulsar 仍然可以保存所有消息。 只有当消费者确认所有这些消息都已成功处理时,才会丢弃保留的消息。
如果消息的使用失败,并且希望再次使用该消息,则可以通过向代理发送否定确认或为未确认的消息启用确认超时来启用该消息的自动重新传递。
简单的发布订阅模型:
2.1.2 基础单元—消息
消息是 Pulsar 的基础“单元”。 消息的组成部分如下:
组件 | 说明 |
Value / data payload | 信息所携带的数据。 所有Pulsar消息都包含原始字节,尽管消息数据也可以符合数据模式。 |
Key | 消息可以选择用键进行标记,这在topic 压缩 等操作很有用。 |
Properties | 用户自定义属性的键值对(可选)。 |
Producer 名称 | 产生消息的生产者的名称。 如果没有指定生产者名称,则使用默认名称。 |
Sequence ID | 每条Pulsar 信息都属于其主题的有序序列。 消息的序列ID是其在该序列中的顺序。 |
Publish time | 消息发布的时间戳。 时间戳由生产者自动应用。 |
Event time | 应用程序可以附加到消息的时间戳(可选), 例如处理消息的时间。 如果没有明确设置,则消息的事件时间为 0 。 |
TypedMessageBuilder | 用于构造消息。 |
2.1.3 生产者
(1)概念
Producer 是连接 topic 的程序,它将消息发布到一个 Pulsar broker上。
(2)发送模式
Producer 可以以同步(sync) 或 异步(async) 的方式发布消息到 broker。
发送模式 | 说明 |
Sync send | Producer 将在发送每条消息后等待 broker 的确认。 如果未收到确认,则 producer 将认为发送失败。 |
异步发送 | Producer 将把消息放于阻塞队列中,并立即返回 然后,客户端将在后台将消息发送给 broker。 如果队列已满(最大大小可配置),则调用 API 时,producer 可能会立即被阻止或失败,具体取决于传递给 producer 的参数。 |
2.1.4 消费者
(1)概念
消费者是通过订阅附加到主题,然后接收消息的流程。
Consumer 向 broker 发送消息流获取申请以获取消息。 在 Consumer 端有一个队列,用于接收从 broker 推送来的消息。 你能够通过receiverQueueSize
参数配置队列的长度 (队列的默认长度是1000
) 每当 consumer.receive()
被调用一次,就从缓冲区(buffer)获取一条消息。
(2)接收模式
可以通过同步(sync) 或者异步(async)的方式从brokers接受消息。
发送模式 | 说明 |
同步接收 | 同步模式,在收到消息之前都是被阻塞的。 |
异步接收 | 异步接收模式会立即返回一个 future 值(如 Java 中的 CompletableFuture ),一旦收到新的消息就立刻完成。 |
(3)消息确认
消费者在成功消费一个消息后,向 Broker 发送一个确认请求。 然后,这条被消费的消息将被永久保存,只有在所有订阅者都确认后才会被删除。 如果希望消息被消费者确认后仍然保留下来,可配置消息保留策略实现。
消息可以通过以下两种方式之一进行确认。
- 被单独确认。在单独确认的情况下,消费者确认每个消息,并向 Broker 发送确认请求。
- 累积确认模式 在累积确认中,消费者只确认它收到的最后一条消息。 所有之前(包含此条)的消息,都不会被再次发送给那个消费者。
2.1.5 Topic
与其他发布-订阅系统一样,Pulsar 中的主题被命名为通道,用于将消息从生产者传输到消费者。 主题名称是具有良好定义结构的 URL: 与其他发布-订阅系统一样,Pulsar 主题是生产者向消费者传递信息的通道。主题名称是具有明确定义结构的 URL:
{persistent|non-persistent}://tenant/namespace/topic
Topic名称组成 | 说明 |
持久化 / 非持久化 |
用来标识 topic 的类型。 Pulsar 支持两种主题类型:持久化和非持久化。 主题默认是持久化类型,如果不特殊指定主题类型,那主题就是持久化的。 对于持久化的主题,所有的消息都会被持久化的保存到磁盘当中(如果 broker 不是单机模式,消息会被持久化到多块磁盘),而非持久化的主题的数据不会被保存到磁盘里面。 |
租户 |
实例中的主题租户。租户对于Pulsar中的多租户特性来说是必不可少的,并且可以扩展到集群中。 |
命名空间 |
将相关联的 topic 作为一个组来管理,是管理 Topic 的基本单元。 大多数对 topic 的管理都是对命名空间的一项配置。 每个租户里面可以有一个或者多个命名空间。 |
topic |
名字的最后一部分。主题名称在Pulsar实例中没有特殊意义。 |
2.1.6 浅谈多租户概念
(1)什么是多租户?
多租户技术或称多重租赁技术,是一种软件架构技术,是实现如何在多用户环境下(此处的多用户一般是面向企业用户)共用相同的系统或程序组件,并且可确保各用户间数据的隔离性。
多租户是一种架构,目的是为了让多用户环境下使用同一套程序,且保证用户间数据隔离。
(2)多租户有什么好处?
- 隔离性,类似于容器化部署
- 可重用,减少成本
- 安全性
(3)Pulsar多租户是如何体现的?
答案:租户+命名空间
Pulsar 有租户的概念。 租户可以跨集群分布,每个租户都可以有单独的认证和授权机制。 租户也是存储配额、消息 TTL和隔离策略的管理单元。
Pulsar 的多租户性质主要体现在 Topic 的 URL 中,结构如下:
persistent://tenant/namespace/topic
可以看到,租户是 topic 的最基本单位(比命名空间和 topic 名称更为基本)。
可以为 Pulsar 实例中的每个租户分配:
- 授权机制
- 适用于租户配置的集群配置
Pulsar 通过租户和命名空间这两个关键概念支持多租户。
- Pulsar 为指定的多个租户配置了合适的容量。
- 命名空间是一个术语,指租户的管理单元。
同一命名空间中 topic 的名称如下:
persistent://tenant/app1/topic-1 persistent://tenant/app1/topic-2 persistent://tenant/app1/topic-3
2.2 集群架构简述
单个 Pulsar 集群由以下三部分组成:
- 一个或者多个 broker 负责处理和负载均衡 producer 发出的消息,并将这些消息分派给 consumer;Broker 与 Pulsar 配置存储交互来处理相应的任务,并将消息存储在 BookKeeper 实例中(又称 bookies);Broker 依赖 ZooKeeper 集群处理特定的任务,等等。
- 包含一个或多个 bookie 的 BookKeeper 集群负责消息的持久化存储。
- 一个Zookeeper集群,用来处理多个Pulsar集群之间的协调任务。
(图片来自:https://pulsar.apache.org/docs/zh-CN/concepts-architecture-overview/)
2.3 存储计算分离的设计方式
2.3.1 什么是存储计算分离设计
顾名思义,存储计算分离设计就是将一个整体的系统把存储部分和计算部分进行分解,达到解耦合的目的,存储计算分离是一种思想,计算节点只负责计算,是无状态的,而存储节点只负责数据的存储。
2.3.2 存储计算分离有什么优势和劣势
优势:
- 解耦合
- 故障隔离,故障转移和恢复容易
- 部署更加灵活
劣势:
- 系统复杂度高
- 性能瓶颈较大
3 安装测试
3.1 安装和运行条件
- 64 位 macOS、Linux 和 Windows 上。
- 64 位 JRE/JDK 8 或更高版本。
- 运行条件:JVM的堆内存默认分配是2G ,可通过修改
conf/pulsar_env.sh
的PULSAR_MEM
属性进行设置。
3.2 下载
- 从 Apache 镜像站下载(Pulsar 2.10.0 二进制版本)
- 从 Pulsar 官网下载页下载
- 从 Pulsar 发布页面下载
- 使用 wget 命令下载:
wget https://archive.apache.org/dist/pulsar/pulsar-2.10.0/apache-pulsar-2.10.0-bin.tar.gz
3.3 各目录的作用
drwxr-xr-x 3 root root 225 1月 22 2020 bin drwxr-xr-x 5 root root 4096 1月 22 2020 conf drwxr-xr-x 3 root root 132 4月 30 15:45 examples drwxr-xr-x 4 root root 66 4月 30 15:45 instances drwxr-xr-x 3 root root 20480 4月 30 15:45 lib -rw-r--r-- 1 root root 32333 1月 22 2020 LICENSE drwxr-xr-x 2 root root 4096 1月 22 2020 licenses -rw-r--r-- 1 root root 6612 1月 22 2020 NOTICE -rw-r--r-- 1 root root 1269 1月 22 2020 README
- bin:启动文件目录
- conf:配置文件目录
- lib:依赖文件目录
- data:单节点启动后自动生成的目录(存放BookKeeper 和Zookeeper信息)
3.4 启动
[root@iZ2ze bin]# pwd /root/apache-pulsar-2.10.0/bin [root@iZ2ze bin]# ./pulsar standalone
3.5 测试
(1)生产消息
[root@iZ2ze bin]# ./pulsar-client produce my-topic --messages "hello-pulsar" ...... 2022-04-30T16:01:52,920+0800 [main] INFO org.apache.pulsar.client.cli.PulsarClientTool - 1 messages successfully produced
(2)消费消息
[root@iZ2ze4m2ri7irkf6h6n8zoZ bin]# ./pulsar-client consume my-topic -s "first-subscription" ...... 2022-04-30T16:15:04,492+0800 [pulsar-client-io-1-1] INFO com.scurrilous.circe.checksum.Crc32cIntChecksum - SSE4.2 CRC32C provider initialized ----- got message ----- key:[null], properties:[], content:hello-pulsar ......
3.6 理解subscription
subscription代表Pulsar的订阅模式,Pulsar一共有四种订阅模式:
- exclusive(默认):在exclusive模式下,只允许一个使用者附加到订阅。 如果多个消费者使用相同的订阅一个主题,则会发生错误。
- shared:在shared或轮询模式下,多个使用者可以附加到相同的订阅。消息通过轮询机制分发给不同的消费者,并且每个消息仅会被分发给一个消费者。 当消费者断开连接,所有被发送给他,但没有被确认的消息将被重新安排,分发给其它存活的消费者。
- failover:在failover模式下,多个使用者可以附加到相同的订阅。主消费者会消费非分区主题或者分区主题中的每个分区的消息。 当主使用者断开连接时,所有(未确认的和后续的)消息都被发送到队列中的下一个使用者。
- key_shared:在key_shared模式下,多个使用者可以附加到相同的订阅。 消息在跨使用者的分发中传递,具有相同键或相同订购键的消息只传递给一个使用者。 无论消息被重新传递多少次,它都被传递给相同的使用者。 当一个消费者连接或断开时,将导致被服务的消费者更改消息的某个键。
(图片来自:https://pulsar.apache.org/docs/zh-CN/concepts-messaging/#topic)
4 小结
Pulsar消息队列可以说是消息队列产品的一个未来发展方向,因为Pulsar更加支持云原生和具有比较优秀的存储计算分离的设计思想,除了Pulsar之外的其他消息队列产品也在逐渐的想这个方向靠近,当然除了这两点以外,Pulsar还有很多的优秀思想和巧妙的设计值得我们去学习和领悟。
回顾本篇文章,可以说对Pulsar的学习和介绍是非常有限的
,Pulsar还有许多的机制和特性,小到如顺序消息、延迟队列、消息持久化和去重,大到如:Pulsar Functions、Pulsar IO、Pulsar SQL和层级存储,以及Pulsar是如何在Docker和Kubernetes中运行的,为什么能更好的支持云原生等等
,如果要想学会这些并能够更好的使用Pulsar,还是建议去读一下Pulsar的官方文档和一些高质量的博客,让我们一起期待我的下一篇博客!
参考:
https://www.cnblogs.com/651434092qq/p/15192976.html
https://pulsar.apache.org/docs/zh-CN/concepts-messaging/
https://pulsar.apache.org/docs/zh-CN/concepts-overview/
https://pulsar.apache.org/docs/zh-CN/
https://pulsar.apache.org/docs/zh-CN/next/concepts-multi-tenancy/