Pulsar基本介绍

基本概念

  • 订阅组:类似于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
  • AUTO模式:不知道Schema结构,可以使用该模式
posted @ 2022-10-15 16:24  马晟  阅读(693)  评论(0编辑  收藏  举报