基本概念
- 订阅组:类似于Kafka中的消费者组,不同订阅组之间消费消息互不干扰
- 主题:分为非分区主题和分区主题
- 非分区主题:一个主题和一个Broker绑定
- 分区主题:由一组非分区内部主题组成,每个内部主题绑定一个Broker(消息可以发送到多个Broker,避免受限于单节点性能)
- Broker:服务节点,负责数据校验、负载均衡、和生产者消费者交互、将消息转发给Bookie节点等功能
- Bookie:存储节点,BookKeeper中的节点
- Ledger:存储数据的集合,生产者会将数据写入Ledger,消费者从中读取
- Entry:Ledger中的每个数据都是一个Entry
- 租户:Pulsar支持多租户
- 命名空间:一个租户可以有多个命名空间,一个命名空间可以有多个主题
- Cluster集群:不同Cluster集群可以相互复制数据,实现跨地域复制,一个Broker节点运行在一个Cluster集群下
应用
租户
- pulsar-admin脚本管理租户、命名空间、主题
命名空间
- 消息保留和过期
- set-retention:设置消息保留策略(数据量或时间)
- set-backlog-quota:设置backlog quota策略,对未确认消息进行处理,策略有三种:
- Broker抛出异常
- Broker正常运行,但是对之后未确认的消息不做持久化处理
- 删除之前backlog积压的消息
- set-message-ttl:设置消息生存时间,未确认的消息超过该时间会自动确认
- 持久化策略:set-persistence
- 消息投递速率:set-dispatch-rate
主题
- Pulsar支持持久化主题和非持久化主题,前缀分别为persistent和non-persistent
- Pulsar提供默认的命名空间default,默认租户public
客户端
生产者
- 如果消息过大,生产者可以将消息分块,每个分块称为chunk,按顺序发送给Broker
- 访问模式
- Shared:允许多个生产者同时发布消息给主题,默认
- Exclusive:只允许一个生产者发送消息给主题,其他生产者连接会报错
- WaitForExclusive:同上,但是不报错只是阻塞,等连接的生产者下线后,会有一个被阻塞的生产者连接,其他的继续阻塞
- 路由模式:决定每条消息被发送到哪个内部主题
- RoundRobinPartition:如果消息指定key,按照key的Hash值将该消息分配给对应的内部主题,如果没有指定key,会将一个时间段内没有key的消息发送给同一个内部主题,每隔10ms以轮询方式切换到下一个内部主题
- SinglePartition:如果消息指定key,按照key的Hash值将该消息分配给对应的内部主题,如果没有指定key,随机选择一个内部主题
- CustomPartition:自定义路由器
- Pulsar支持异步发送消息
- 提供了生产者拦截器ProducerInterceptor
消费者
- 订阅模式:支持四种订阅模式
- Exclusive:独享,一个订阅组只绑定一个消费者
- FailOver:灾备,一个订阅组绑定多个消费者,Pulsar从中选择一个作为主消费者,将所有的消息发送给该消费者,该消费者因故下线,重新选择主消费者
- Shared:共享,一个订阅组绑定多个消费者,轮询方式分发消息
- Key_Shared:键共享,相同key发送到同一个消费者(该模式需禁用消息批次机制)
- 确认方式:Pulsar的每条消息都有一个消息Id,消费成功的消息Id会作为ACK信息发送给Broker
- 单条确认:每条消费成功的消息都发送ACK信息
- 累计确认:只将最后一条消费成功的消息Id发送给Broker
- 消息批次中的单条确认:单条确认消息批次中的部分消息,不需要等一个批次的所有消息全都消费成功后统一确认
- 取消确认:消费消息失败可以通过Consumer.negativeAcknowledeg取消确认,要求Broker重新投递
- Pulsar支持重试主题和死信主题
- seek方法可以重置消费位置
- Pulsar支持同时订阅多个主题
Schema
- 简单类型:默认使用byte[]作为Schema类型
- 复杂类型
- KeyValue
- INLINE:key、value一起作为消息的value
- SEARATED:key作为消息key,value作为消息的value
- Struct实体类:
- AvorSchema
- JsonSchema
- ProtobufSchema
- GenericRecordBuilder自定义Schema
- KeyValue
- AUTO模式:不知道Schema结构,可以使用该模式