一、前言
Pulsar 是一个用于服务器到服务器的消息系统,具备高吞吐,低延迟,计算存储分离,多租户,异地复制等特性,这些特性也使得Pulsar成为kafka的有力竞争者
二、Pub/Sub
下面介绍pulsar做为一个发布订阅消息中间件的一些主要概念
- Message
- Producer
- Consumer
- Broker
- Topic
- Subscription
1. Message
消息是 Pulsar 的基础单元,Producer 发送消息,Consumer 消费消息,Broker 保存消息。
1.1 消息的组成
- data:数据
- key:消息键,非常重要的一个概念,消息的发送和路由都与它有关
- property:键值对,存放一些主数据之外的额外消息
- producer name:消费者名
- sequence id: 序列号。消息去重会使用到这个参数,相同的序列号只会发送一次
- publish time:发布时间
- event time: 事件事件
- TypedMessageBuilder: 用于构建消息
2. Producer
Producer 可以发送消息到指定的 topic。往 Pulsar 里发送消息时,相应的数据会带上 schema 的信息。Pulsar 会确保一个 producer 往 topic 发送的消息是满足一定的 schema 格式。
2.1 发送模式
同步发送send,异步发送sendAsync
2.2 批量处理
通过设置enableBatching、batchingMaxMessages、maxPendingMessages等,来设置批量消息的发送规则。
2.3 消息压缩
通过设置compressionType,来指定压缩类型
2.4 分块
分块的前提是禁用批量处理
3. Consumer
consumer与broker建立TCP长链接,然后开始接受从broker的推送来的消息。同时也会根据schema来格式化消息
3.1 接收模式
同步接收
异步接收,返回一个CompletableFuture
3.2 ACK
确认消息/取消确认:消费者成功/失败消费一条消息,这条消费者会发送一个确认消息/取消确认给broker。成功的话,这条消息会根据消息保留策略来进行删除。
3.3 监听器
通过MesssageListener可以监听接受的每条消息,通过received方法进行逻辑处理
3.4 死信、重试队列
设置了死信队列,消费者消费一条消息时,当超时或者否定确认,这条消息会被重新传递,当多次的重新传递后,这条消息会被放入到指定的死信topic中。
重试队列,当消费者消费一条消息时,当超时或者否定确认,默认会进行重试。
3.5 Cursor 和 Reader
Cursor 在消费者端,代表了每组订阅组的消费状态。 broker 的 cursor 会追踪每个订阅消费到了哪里,然后记录下来。
Reader 和 Cursor 不同, cursor 是 pulsar帮你管理消费状态信息,但是 Reader 是一个没有状态的,消息被消费了,它消费状态不会持久化。也就是下次再读取的时候还是能读取到。
4. Broker
分区落靠的服务器,就是 Broker。Broker 用来接收与发送消息,生产方连接到 broker 去生产消息,消费方连接到 broker 去消费消息。
数据不会存储在 Broker 上,是放在 Bookkeeper 中。这也是 Pulsar 与其他中间件的区别。
5. Topic
topic是消息的集合,所有的producer的消息,都会归属到指定的topic里。所有topic里的消息,会按照一定的规则,被切分成不同的分区(Partition)。一个分区会落到一台broker上。
topic格式:{persistent|non-persistent}://tenant/namespace/topic
pulsar层级化的管理,使用 Tenant 和 namespace。
6. Subscription
consumer 连接到 broker,需要定义自己的 Subscription ,一个订阅的所有 consumer 会作为一个整体去消费 topic 里的所有消息。
6.1 订阅模式
四种模式:Exclusive、Failover、Shared、Key_Shared
Exclusive:只有一个 consumer 可以消费消息。
Failover:一个消费者作为一个主题分区( partition, 一个 topic 会有多个 partition ) 的主使用者,其他消费者被作为故障转移备用。
Shared: 消息会轮训发送给该订阅下的所有 consumer 。
Key_Shared:消息按照 key 进行分发给 consumer。融合了 Failover 和 Shared 的特性。
三、schema
Schema 的作用就是如何序列化反序列化数据,不用在客户端另外去做处理。
schema 的格式
- type:schema类型
- schema:schema 定义,和数据
- properties:跟 schema 关联的部分属性
两类 schema
- key-value:要同时定义 key schema 和 value schema,将这两者的信息组合在一起放置在 schema 信息文件内
- struct :AVRO、JSON、Protobuf 三种类型
schema 的兼容性检查
