消息中间件的两种投递模式及kafka的实现

消息中间件的两种投递模式:点对点和发布/订阅

 

对于消息中间件,一般有两种消息投递模式:点对点(P2P,Point-to-Point)模式和发布/订阅(Pub/Sub)模式

点对点是基于队列的,消息生产者发送消息到队列,消息消费者从队列中接收消息。

发布/订阅模式在消息的一对多广播时采用。

 

这两种模式时消息中间件领域最核心、最基础的消息分发模型。

像kafka这样的现代消息系统,其强大之处在于并非严格遵循其中某一种,而是通过灵活的消费者组(Consumer Group)机制,同时实现这两种模式的核心语义。

 

一、点对点模式

  • 核心特征:一条消息只能被一个消费者消费。消息一旦被消费就会从队列中移除或被标记为已处理
  • 类比:就像一个队列(例如,银行的一个排队通道),下一个人(消费者)接手上一个人办理完后的事务(消息),同一个事务不会被重复处理。
  • 关键目标
    • 负载均衡:多个消费者同时从一个队列取消息,共同分担处理压力,提高系统吞吐量
    • 消息不会被重复消费:确保任务或事务只被处理一次
  • kafka如何实现P2P模式:Kafka通过“一个分区+单个消费者组”来实现
    • 创建一个主题(Topic),并为它设置一定数量的分区(Partitions)
    • 让一个消费者组(Consumer Group)下的多个消费者实例(Consumer Instances)来订阅这个主题
    • Kafka会将主题的所有分区 分配给组内的各个消费者(一个分区在同一时间只能被组内一个消费者消费)
    • 这样,每条消息(由于位于某个特定分区)只会被发送到消费者组内的某一个消费者实例进行处理

效果:消息被均匀地分发给组内地多个消费者并行处理,实现了负载均衡,且每条消息只被消费一次。完美契合了P2P模式地需求。

 

二、发布/订阅模式

  • 核心特征:一条消息会被广播给所有订阅它的消费者
  • 类比:一个新闻电台,电台(生产者)发布一条新闻(消息),所有正在收听这个频道(主题)的听众(消费者)都会同时收到这条新闻
  • 关键目标
    • 广播:将消息分发给多个独立的消费者系统,这些系统可能对消息有不同的处理和用途(例如,一个订单创建消息,需要同时通知库存系统、积分系统、推荐系统)
  • Kafka如何实现Pub/Sub模式?:Kafka通过“多个消费者组”来实现 
    • 同一个主题(Topic)被多个独立的消费者组(Consumer Group)订阅
    • 对于每个消费者组而言,kafka都会将其视为一个独立的“订阅者”

    •  

      每个消费者组都会收到主题下全部的消息(每个组都会独立地、完整地消费整个主题的数据流)

    •  

      在每个消费者内部,消息的分配依然遵循P2P模式(即组内消费者负载均衡)

效果:一条消息从生产者发出后,会被 多个消费者组 同时接收并各自处理,这实现了消息的广播,即 Pub/Sub模式。

 

三、总结

1、点对点模式:

  • 目标:负载均衡,一条消息只被一个消费者处理
  • Kafka实现方式:单个消费者组 消费一个主题,组内多个消费者实例共享主题的所有分区,每条消息只被组内的一个实例消费
  • 图示: 生产者 -> [主题] -> (消费者A,消费者B)属于同一个组,消息在A、B间分配

 

2、发布/订阅模式

  • 目标:广播,一条消息被所有订阅者处理
  • Kafka实现方式:多个消费者组同时订阅一个主题,每个组都能收到全量消息,并在组内进行负载均衡。
  • 图示:生产者 -> [主题] -> Group 1: (消费者A1, B1)

                                              -> Group 2: (消费者A2, B2)

提示:“发布/订阅”中的“订阅者”指的时整个消费者组,而不是组内单个消费者实例,单个消费者实例,单个消费者实例只是实现组内负载均衡的单元

 

Kafka本质上是一个高吞吐、持久化的发布/订阅系统,同时通过消费者组的机制,优雅地集成并增强了点对点模式地功能。

posted @ 2025-09-12 11:21  hqq的进阶日记  阅读(12)  评论(0)    收藏  举报