Overview
Apache RocketMQ是一个具有低延迟、高性能和可靠性、万亿级容量和灵活可伸缩性的分布式消息流和流媒体平台。它由四个部分组成:名称服务器、代理(brokers)、生产者和消费者。它们的每一个都可以横向扩展,而不会出现单点故障。如上图所示。
命名服务器集群
名称服务器提供轻量级服务发现和路由。每个名称服务器记录完整的路由信息,提供相应的读写服务,支持快速存储扩展。
Broker 集群
代理通过提供轻量级的TOPIC和QUEUE机制来处理消息存储。它们支持推(Push)和拉(Pull)模型,包含容错机制(2个副本或3个副本),并通过在原始的时间顺序中积累以百万的信息,提供强大的峰值和容量填充。此外,代理还提供了灾难恢复、丰富的度量数据和警报机制,这些都是传统消息传递系统中所缺少的。
Producer 集群
生产者支持分布式部署。分布式生产者通过多种负载均衡模式将消息发送到代理集群。发送过程支持快速失败和低延迟。
Consumer 集群
消费者也支持在推和拉模型中进行分布式部署。它还支持集群消费和消息广播。它提供实时消息订阅机制,可以满足大多数客户需求。RocketMQ的网站为感兴趣的用户提供了一个简单的快速入门指南。
NameServer
NameServer是一个功能完备的服务器,主要包括两个特性:
- Broker 管理,NameServer接受来自Broker集群的注册,并提供心跳机制来检查Broker是否还活着。
- 路由管理,每个名称服务器将保存关于代理集群的整个路由信息和客户查询的队列信息。
如我们所知,RocketMQ客户端(生产者/消费者)将从NameServer查询队列路由信息,但是客户端如何找到NameServer地址?
有四种方法可以向客户端提供NameServer地址列表:
- 编程的方式,如
rocketmq.namesrv.addr
- Java参数,使用
rocketmq.namesrv.addr
- 环境变量,使用
NAMESRV_ADDR
- HTTP端点
关于如何找到NameServer地址的更多细节请查阅 here.
Broker Server
代理服务器负责消息存储和投递、消息查询、HA保证等等。
正如下图所示,代理服务器有一些重要的子模块:
- Remoting模块,代理的入口,处理来自客户端的请求。
- 客户端管理,管理客户端(生产者/消费者)并维护消费者的主题订阅。
- 存储服务,提供在物理磁盘中存储或查询消息的简单api。
- HA服务,提供master broker和slave broker之间的数据同步功能。
- 索引服务,通过指定的键为消息构建索引,并提供快速的消息查询。