Pulsar 的广播功能可以通过 多个订阅 来实现。每个订阅会维护自己的消息消费位置,从而实现广播的效果:同一条消息可以被多个订阅同时消费

以下是更深入的解读:


Pulsar 广播的实现机制:

  1. 一个主题可以有多个订阅
    • 当生产者向主题发送一条消息时,这条消息会进入主题的消息存储(通常是分布式的存储层,例如 BookKeeper)。
    • 每个订阅都会从该主题读取消息,并为该订阅的消费者提供消息消费功能。
    • 这就意味着:如果一个主题有多个订阅,生产者发送的消息会被所有订阅记录,每个订阅的消费者都可以消费到这些消息。
  2. 不同订阅维护独立的消费位置:
    • 每个订阅会维护自己的消费进度(偏移量)。
    • 即便多个订阅针对同一个主题同时存在,它们的消费位置是互相独立的。因此,即使一个订阅的消费者已经成功消费了一条消息,这条消息仍然会保留在其他订阅的消息队列里等待被消费。
  3. 广播的效果
    • 如果一个主题有多个订阅,消息会被发送到主题后,被每个订阅并行地处理。
    • 每个订阅有自己的消费者组,负责消费订阅中消息,因此实现了 广播到多个订阅 的效果。

示例场景:如何基于多个订阅实现广播?

场景概述:

假设我们有一个消息主题 "user.events",用于记录用户触发各种事件(比如登录或注册)。我们希望:

  1. 一类消费者负责存档事件信息,比如订阅名 "event-archiver".
  2. 另一类消费者负责实时统计事件数据,比如订阅名 "event-stats".

广播实现:

生产者将消息发送到主题 user.events:

  • 订阅 "event-archiver" 的消费者会独立地消费消息以进行存档。
  • 订阅 "event-stats" 的消费者会独立地消费消息以进行实时统计。

这种机制会产生广播效果:同一个消息会被两个订阅并行处理


和订阅模式的关系:

Pulsar 的订阅模式(独占、共享、故障转移等)是针对同一个订阅内的消费者进行消息分配的规则。广播功能的实现则与订阅数量有关,而非订阅的消费模式。

具体来说:

  • 如果一个主题有多个订阅,每个订阅都能独立地消费主题上的消息。所以只要有多个订阅,就能够实现广播效果。
  • 每个订阅的消费模式(独占/共享等)只影响内部消费者如何分配消息,而不会影响广播功能。

Pulsar 的优势:

相比 Kafka,Pulsar 的这种订阅机制在广播场景中非常灵活,因为:

  1. 无需重复创建主题或重复写入内容,只需针对同一个主题增加订阅即可。
  2. 消费位置独立,能很好地支持不同功能模块的并行处理。

总结:

Pulsar 实现广播功能就是基于 多个订阅的机制 来实现的。

  • 单主题 + 多订阅 是 Pulsar 支持广播的核心。
  • 每个订阅都有自己的消费者,因此同一条消息可以被多个订阅独立消费,实现广播到多个模块的效果。


Pulsar实现广播功能是不是就是基于多个订阅来实现的?插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.choupangxia.com/2025/07/12/pulsar/