RocketMQ基础架构

基于官方文档进行翻译

概览

Apache RocketMQ是一个分布式消息和流平台,它的特性包括低延迟,高性能,高可靠性,万亿级容量和弹性扩展。它的架构主要包括四部分:命名服务(name servers),代理服务(brokers),生产者(Producers),消费者(Consumers)。其中每个部分都是可以水平扩展从而避免单点故障。如图所示:

在这里插入图片描述## 命名服务集群
命名服务提供了轻量的服务用于发现和路由。每个命名服务都记录了全量的路由信息,提供了读写一致性的服务,并且支持快速存储扩展。

代理服务集群

代理服务利用轻量的话题(TOPIC)和队列(QUEUE)机制来存储消息。代理服务能够支持推(Push)和拉(Pull)的模式,利用多拷贝来支持容错(2份或者3分拷贝),提供强大的峰值填充和以原始时间顺序堆积万亿数量级消息。并且代理服务还具备一些传统消息系统没有的特性,比如灾难恢复,多维度统计,预警机制等。

生产者集群

生产者支持分布式部署。分布式生产者通过负载均衡将信息发送到代理服务集群,发送进程支持快速失败(fail fast)[^1]以及低延迟。

消费者集群

消费者也能够在推拉模式中也能够支持分布式部署,并且支持集群消费以及消息广播。这种方式也提供了实时消息订阅机制,能够满足大部分消费者的需求。RocketMQ的官网也提供了相关的网页给有兴趣的用户。

命名服务

命名服务是纯粹的功能性服务器,主要包含2个特性:

  • 代理管理,命名服务接受代理服务集群的注册,同时通过心跳机制来检查单个代理的有效性
  • 路由管理,每个路由服务都保存了代理集群完整的路由信息以及客户端查询所需要的队列信息。RocketMQ的客户端(生产者/消费者)会从命名服务获取队列路由信息,但是客户端如何获取命名服务的地址?

下面有4个方法将命名服务地址推流至客户端:

  • 硬编码,如 producer.setNamesAddr("ip:port").
  • Java运行参数,使用 rocketmq.namesrv.addr
  • 环境变量,使用 NAMESRV_ADDR
  • HTTP的终点(Endpoint)。

点击这里查看更多关于命名服务的细节文档。

代理服务

代理服务负责消息存储和分发,消息查询,高可用等等。
如下图所示,代理服务包含几个重要的子模块:

  • 远程模块,代理服务入口,处理客户端发送的请求。
  • 客户端管理,管理客户端(生产者/消费者)并且维护消费者订阅。
  • 存储服务,为存储在物理硬盘上的消息提供简单的保存或查询接口。
  • 高可用服务,在主代理和从代理直接提供数据同步功能。
  • 索引服务,根据特定的key对消息进行索引构建,用于提供消息的快速检索。

在这里插入图片描述[^1]:当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。
例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值