架构设计
1 技术架构
Client:
-
ProducerGroup:
- 包含多个生产者(P1, P2,..., Pn),负责创建和发送消息。生产者会将消息发送到 Broker 集群中,发送时会根据 NameServer 提供的路由信息找到合适的 Broker 进行消息投递。
- 生产者可以使用不同的发送模式,如同步发送、异步发送或单向发送,以满足不同的性能和可靠性要求。
-
ConsumerGroup:
-
包含多个消费者(C1, C2,..., Cn),负责从 Broker 集群中拉取或接收推送的消息进行消费。
-
消费者可以通过拉取模式(Pull)或 Broker 的主动推送模式(Push)来获取消息,消费完成后可以向 Broker 发送确认信息,以确保消息的可靠消费。
-
Server:
-
NameServerCluster:
- 由多个 NameServer 实例(NS1, NS2,..., NSn)组成,是一个轻量级的服务集群。
- 主要功能是维护 Broker 集群的元数据信息,包括 Broker 的地址、主题信息、队列信息等,并为生产者和消费者提供路由信息。
- 生产者和消费者会定期向 NameServer 集群拉取最新的路由信息,确保消息的准确发送和接收。
-
BrokerCluster:
-
由多个 Broker 组成,是消息存储和服务的核心部分。
-
Broker1, Broker2,..., Brokern:
-
StorageModule:
- Commit Log: 是存储消息的物理文件,所有消息按顺序存储在此,保证了存储的高性能和顺序性,确保了消息的快速写入和持久化。
- Consumer Queue: 存储消息的逻辑队列,为消费者提供了逻辑上的消费队列,方便消息的消费和管理。
- Index Service: 提供消息的索引服务,便于根据消息的各种属性(如消息 ID、消息关键字等)快速查找消息。
- Disk Storage: 负责将 Commit Log 和 Consumer Queue 存储在磁盘上,实现消息的持久化存储。
-
NetworkModule:
- NIO Network Server: 基于 NIO 的网络服务器,提供高效的网络通信服务,负责与生产者和消费者进行网络通信,接收和发送消息。
-
ServiceModule:
- Message Service: 负责消息的接收、存储和转发等核心操作,将接收到的消息存储到 StorageModule 中,并将消息分发给消费者。
- Transaction Log Service: 处理事务消息,保证事务消息的原子性、一致性、隔离性和持久性,包括事务消息的存储、提交和回滚等操作。
- Delay Message Service: 处理延迟消息,根据消息的延迟时间将消息存储和调度,在延迟时间到达后将消息发送到相应的队列进行消费。
- Filter Service: 提供消息过滤功能,允许消费者根据不同的过滤条件(如消息标签、消息属性等)来选择性地接收消息,提高消息消费的灵活性。
- Trace Service: 对消息的流转进行跟踪,记录消息从生产者到消费者的完整链路信息,便于系统的监控和问题排查。
-
ReplicationModule:
- Replication Manager: 负责在 Broker 之间进行消息的复制操作,确保消息的冗余和高可用性。当一个 Broker 存储消息时,会将消息复制到其他 Broker 上,防止数据丢失和提高系统的容错性。
-
-
通过这样的架构,Apache RocketMQ实现了高可用、高性能、高可扩展的消息传递系统,支持多种消息类型和复杂的业务场景,同时提供了强大的消息存储、服务和管理功能,确保消息在分布式环境中的可靠传递和处理。
RocketMQ 网络部署特点
-
NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。
-
Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave 的对应关系通过指定相同的BrokerName,不同的BrokerId 来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与NameServer集群中的所有节点建立长连接,定时注册Topic信息到所有NameServer。 注意:当前RocketMQ版本在部署架构上支持一Master多Slave,但只有BrokerId=1的从服务器才会参与消息的读负载。
-
Producer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer获取Topic路由信息,并向提供Topic 服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。
-
Consumer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer获取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,消费者在向Master拉取消息时,Master服务器会根据拉取偏移量与最大偏移量的距离(判断是否读老消息,产生读I/O),以及从服务器是否可读等因素建议下一次是从Master还是Slave拉取。
集群工作流程:
- 启动NameServer,NameServer起来后监听端口,等待Broker、Producer、Consumer连上来,相当于一个路由控制中心。
- Broker启动,跟所有的NameServer保持长连接,定时发送心跳包。心跳包中包含当前Broker信息(IP+端口等)以及存储所有Topic信息。注册成功后,NameServer集群中就有Topic跟Broker的映射关系。
- 收发消息前,先创建Topic,创建Topic时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic。
- Producer发送消息,启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息。
- Consumer跟Producer类似,跟其中一台NameServer建立长连接,获取当前订阅Topic存在哪些Broker上,然后直接跟Broker建立连接通道,开始消费消息。