RocketMQ体系结构
概述
Apache RocketMQ是一个分布式消息和流媒体平台,具有低延迟、高性能、高可靠性、万亿级容量和灵活的可扩展性。它由四个部分组成:name servers名称服务器、brokers代理、producers 生产者和consumers消费者。它们中的每一个都可以水平扩展,而不会出现单点故障。如上图所示。
Name Server集群
Name Servers提供轻量级服务发现和路由信息。每个Name Server记录着完整的路由信息,提供相应的读写服务,支持快速的存储扩展。
Broker集群
Brokers通过提供轻量级的TOPIC和QUEUE机制来处理消息存储。它们支持消息推送和消息拉取模型,包含容错机制(2个副本或3个副本),并提供强有力的削锋能力,具有数千亿条消息的存储能力,并且保持消息的原有顺序。此外,Brokers 还提供灾难恢复、丰富的度量统计数据,和警报机制,这些都是传统消息传递系统所缺少的。
Producer集群
Producers支持分布式部署。分布式的Producers通过多种负载均衡模式,向Broker集群发送消息。发送消息的进程支持快速失效和低延迟。
Consumer集群
Consumers也支持推送和拉取模式的分布式部署。它还支持集群消费和消息广播。它提供了实时消息订阅机制,可以满足大多数消费者的需求。RocketMQ的网站为感兴趣的用户提供了一个简单的快速入门指南。
RocketMQ client
MQ的client指的是Producer/Consumer。
Name Server
NameServer是一个功能齐全的服务器,主要包括两个功能:
- Broker管理, Broker 集群的broker注册到NameServer,NameServer接受注册,并提供心跳机制来检查broker是否alive。
- 路由管理, 每个NameServer保存有关broker集群的完整的路由信息,和用于clients查询的队列信息.
如我们所知,RocketMQ clients(生产者/消费者)将从NameServer查询队列路由信息,但是clients如何找到NameServer地址?
向 clients(生产者/消费者)提供NameServer地址列表有四种方法:
- 编程方式,如
producer.setNamesrvAddr("ip:port")
. - JAVA选项,使用
rocketmq.namesrv.addr
. - 环境变量,使用
NAMESRV_ADDR.
- HTTP Endpoint。
有关如何查找NameServer地址的更多详情,请参阅这里.
Broker服务器
Broker服务器负责消息存储、传递和查询、HA保证等。
如下图所示,Broker服务器有几个重要的子模块:
- 远程模块,是broker的入口,处理来自clients的请求。
- client管理,管理clients (生产者/消费者)并维护消费者的主题订阅。
- 存储服务,提供简单的API来存储或查询物理磁盘中的消息。
- HA服务,在主从broker服务器之间提供数据同步功能。
- 索引服务,通过指定的键为消息建立索引,并提供快速消息查询。