二、pulsar概念

生产者Producer

生产者发送模式:

  1. 同步模式:Sync Send,生产者将会等待直到消息确认,如果确认没有被接收,生产者将会视为这次失败
  2. 异步模式:生产者将消息放入阻塞队列,并立即返回,后台将发送消息给broker。如果队列已满,生产者将阻塞或者立刻失败,该行为取决于创建生产者时的参数

批量发送Batching

若该功能开启,生产者将堆积消息并批量发送在一个请求中。

在2.6.0版本之前,若批量发送中的消息中有一个存在not Acknowledged则整个批量发送请求将会retry

2.6.0版本之后,可以开启参数acknowledgmentAtBatchIndexLevelEnabled = true,来使用batchIndex功能,消费者将筛选出批量消息中已经确认的消息,并把这些确认的消息发送给broker,broker维护这一张batch Index表,用于批量消息的重发。

chunking分块

当分块开启时,若有一个消息超过默认最大发布payload,生产者将原消息分开成chunking message并带上chunked metadata。对于broker来说这些chunking message和一般的消息没有区别,区别主要在于消费者需要一块buffer来存这些chunking message。当consumer收到所有chunking message 时,将会合并这些消息。默认情况下,消费者将会等待一分钟去接收并确认到所有的chunking message。

Topics

name组成

  1. {persistent|non-persistent}://tenant/namespace/topic
  1. persistent|non-persistent:选择该Topic下是否需要持久性存储
  2. tenant:租户
  3. namespace:命名空间
  4. topic:topic名称

多主题订阅

从1.23.0开始pulsar可以同事订阅多个topic,方式如下:

  1. 通过正则表达式,for example persistent://public/default/finance-.*
  2. 通过明确指定的topic列表

分区概念

二、pulsar概念和架构 - 图1

如上图所示,一个主题并没有保存在单个broker中,而是保存在Pulsar集群中的多个broker中,这提高了集群的最大吞吐量。

Routing mode(路由模式):决定了Producer到partition topic的方式,路由模式一般决定了分区、路由的方式,这和吞吐能力相关。

Subscription mode(订阅模式):决定了partition topic 到Consumer的方式,订阅模式由应用的语义来做决定。

Routing mode路由模式

有三种模式的Routing mode可用:

  • RoundRobinPartition:

    1. 如果消息没有指定Key,将以轮询的方式把消息发送到各个分区。
    2. 如果指定饿了Key,将计算Key的hash值,根据hash值将消息分配到对应的分区
  • SinglePartition:

    1. 如果没有Key,将随机将消息发送到分区。
    2. 如果指定了Key,将计算Key的hash值,根据hash值将消息分配到对应的分区。
  • CustomPartition:
    使用自定义的消息路由器来决定特定消息的分区,例如使用Java client并实现MessageRouter接口

非持久的Topic

non-persistent://tenant/namespace/topic

非持久的相对于持久的topic,拥有更低的发布延迟,但可能丢失消息。

消息的保留和过期

存在三种模式:

  • 默认default:

    1. 立刻删除所有已经被确认的消息
    2. 以backlog的形式,持久保存所有的未被确认消息
  • Message retention:能存储所有已经被确认的消息
  • Message expiry:设置TTL时间来保留那些未被确认的消息,已确认的消息将删除