分布式消息中间件中的一些概念(接上一篇的《什么是分布式消息中间件?》)

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
注册配置 MSE Nacos/ZooKeeper,182元/月
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
简介: 接上一篇的《什么是分布式消息中间件?》,这一篇来介绍一下消息中间件相关的一些概念和专业术语。   Topic 主题,从逻辑上讲一个Topic就是一个Queue,即一个队列;从存储上讲,一个Topic存储了一类相同的消息,是一类消息的集合。

接上一篇的《什么是分布式消息中间件?》,这一篇来介绍一下消息中间件相关的一些概念和专业术语。

 

Topic

主题,从逻辑上讲一个Topic就是一个Queue,即一个队列;从存储上讲,一个Topic存储了一类相同的消息,是一类消息的集合。比如一个名称为trade.order.queue的Topic里面存的都是订单相关的消息。

 

Partition

分区。分区是存在于服务端,内部保持顺序、且顺序不可变更的一个队列,用于存储消息。分区可能不应该出现在消息领域内,在使用消息中间件发送和消费时,实际上用户是感受不到分区这个概念的。下面这幅图便于大家去理解分区:

一个Topic存储消息时会分为多个Partition,每个Partition内消息是有顺序的。至于为什么需要将Topic划分成按照Partition存储,在以后设计和实现部分会解释。

 

Producer

生产者,消息的生产方,一般由业务系统负责产生消息。

Producer负责决定将消息发送到哪个Topic的那个Partition。

 

Consumer

消费者,消息的消费方,一般是后台系统负责异步消费消息。

Consumer订阅Topic,消费Topic内部的消息。

 

Broker

消息的存储者,一般也称为Server,在JMS中叫Provider,在RocketMQ(阿里开源的消息中间件)中叫Broker。

 

NameServer

NameServer其实不是消息中间件的概念了,一般在分布式系统中都会有一个角色作为NameServer用于服务发现,在Kafka中使用ZooKeeper来实现,在RocketMQ中单独写了NameServer服务。

 

Group

Group用于标志Consumer的身份,拥有相同Group名称的Consumer一般消费一类消息,且消费逻辑是相同的。

RocketMQ中Producer也需要Group标志身份,但是实际上Producer是不需要的。因为Producer之间是不相关的,Consumer之间是需要协同工作的。

 

这里多解释一下为什么Consumer之间是需要协同工作的。

比如启动了两个Consumer来消费订单消息,然后调用物流系统进行发货。那么在产生一条订单消息后,只能让两个Consumer中的一个来处理消息(否者就发货两次了)所以需要一个标识将这两个Consumer标记为行为一致的。另一个场景是如果一个Consumer实例宕机了,这个时候需要有行为相同的Consumer去接管它的消费任务,那么就需要一个标识来标识行为相同的Consumer。

 

那是不是只要行为相同的Consumer只存在一个就好了呢?是的,如果只有行为一致的Consumer,那么就不存在系统工作,也可以不需要Group,每个Consumer拥有独立的ID即可。但是实际系统是不可能的,从系统可用性和性能上都不可能(单个Consumer就有单点问题,也有性能问题,毕竟我们谈的是分布式系统)。

 

集群消费

集群消费的含义是说一类Consumer(即Group相同的Consumer的集合)共同完成对一个Topic的消费。其实上面说明Consumer需要协同工作时举例中就默认是集群消费了,这也是现实业务中95%以上需求的消费方式。

 

具体来看集群消费模式如下:

 

Consumer0和Consumer1属于同一个Group,假设Topic中有0~5共6条消息,Consumer0消费到0~2,Consumer1消费到3~5,它们共同完成了Topic中消息的消费。

 

这存在于大量的无状态的后台系统中,就如上面说的消费订单消息进行发货的例子。

 

广播消费

广播消费的含义是Topic中的每一条消息都会被一类Consumer(属于同一个Group的多个Consumer)中的每个Consumer实例消费。

如下图,Topic总的0~5共6条消费,Consumer0会消费到0~5完整的6条消息,Consumer1也会消费到0~5的6条消息。

这种消费往往应用在有状态的服务,比如缓存服务器去消费消息更新自己的缓存数据,那么每一台缓存服务器都需要拿到消息。

 

结语

了解什么是分布式消息中间件和消息中间件的一些概念之后,下一篇计划谈一谈分布式消息中间件的需求,毕竟要有的放矢,明确需求才能知道要做什么,怎么做才合适。

 

欢迎关注此公众号,将长期发布和分布式消息中间件相关的技术内容。当然如果需要私下交流,也可以加通过留言或信息的方式加作者微信。

 

 

PS:为什么本文开头会用一张Kafka的Logo呢?因为Kafka真的是一个非常优秀的软件,文中一些概念也来源于Kafka(如果对消息中间件有兴趣,强烈建议去看看Kafka的文档和实现)。

如果本文对您有帮助,点一下右下角的“推荐”
目录
相关文章
|
6月前
|
消息中间件 存储 Kafka
分布式消息中间件设计与实现
本文深入探讨了消息中间件的核心功能实现与高并发、高可用设计。在生产者设计中,涵盖消息构造、序列化、路由策略及可靠性保障(如ACK机制)。消费者部分分析了拉取/推送模式、分区分配与消息确认机制。同时,Broker作为核心组件,负责消息路由、存储和投递,并通过索引技术实现快速检索。 高并发设计方面,重点讨论了文件存储(顺序写入、分段存储)、日志结构存储及负载均衡策略(如哈希分区、轮询分区)。为确保高可用性,文章详细解析了主从复制、故障转移机制以及同城/异地多活容灾方案。
|
1月前
|
算法 NoSQL 关系型数据库
《聊聊分布式》分布式系统核心概念
分布式系统由多节点协同工作,突破单机瓶颈,提升可用性与扩展性。CAP定理指出一致性、可用性、分区容错性三者不可兼得,BASE理论通过基本可用、软状态、最终一致性实现工程平衡,共识算法如Raft保障数据一致与系统可靠。
|
6月前
|
消息中间件 存储 中间件
分布式消息中间件基础
消息中间件是一种基于异步消息传递的分布式系统通信工具,核心功能包括消息传输、存储、路由与投递,能够实现系统解耦、异步处理和流量削峰。其主要组件包括生产者、消费者、Broker、主题/队列等,支持点对点和发布-订阅两种消息模型。主流中间件如Kafka(高吞吐)、RabbitMQ(灵活路由)、RocketMQ(事务支持)各有特色,适用于不同场景。此外,中间件还涉及多种协议(AMQP、MQTT等)、可靠性传输机制(持久化、确认机制)、顺序性与重复性问题解决以及事务支持(两阶段提交、本地消息表等)。选择中间件需根据业务需求权衡性能、功能和运维成本。
|
存储 SQL 分布式数据库
OceanBase 入门:分布式数据库的基础概念
【8月更文第31天】在当今的大数据时代,随着业务规模的不断扩大,传统的单机数据库已经难以满足高并发、大数据量的应用需求。分布式数据库应运而生,成为解决这一问题的有效方案之一。本文将介绍一款由阿里巴巴集团自主研发的分布式数据库——OceanBase,并通过一些基础概念和实际代码示例来帮助读者理解其工作原理。
1195 0
|
存储 缓存 监控
分布式链路监控系统问题之kywalking在后期维护过程中可能会遇到中间件版本升级的问题如何解决
分布式链路监控系统问题之kywalking在后期维护过程中可能会遇到中间件版本升级的问题如何解决
162 1
|
消息中间件 存储 架构师
|
消息中间件 中间件 数据库
NServiceBus:打造企业级服务总线的利器——深度解析这一面向消息中间件如何革新分布式应用开发与提升系统可靠性
【10月更文挑战第9天】NServiceBus 是一个面向消息的中间件,专为构建分布式应用程序设计,特别适用于企业级服务总线(ESB)。它通过消息队列实现服务间的解耦,提高系统的可扩展性和容错性。在 .NET 生态中,NServiceBus 提供了强大的功能,支持多种传输方式如 RabbitMQ 和 Azure Service Bus。通过异步消息传递模式,各组件可以独立运作,即使某部分出现故障也不会影响整体系统。 示例代码展示了如何使用 NServiceBus 发送和接收消息,简化了系统的设计和维护。
252 3
|
运维 安全 Cloud Native
核心系统转型问题之分布式数据库和数据访问中间件协作如何解决
核心系统转型问题之分布式数据库和数据访问中间件协作如何解决
|
存储 SQL 消息中间件
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
197 0
|
存储 分布式计算 数据处理
解释弹性分布式数据集(RDD)的概念
【8月更文挑战第13天】
1172 4

热门文章

最新文章