0
点赞
收藏
分享

微信扫一扫

RocketMQ架构

夏侯居坤叶叔尘 2021-09-30 阅读 68

OVERVIEW

Apache RocketMQ是一个分布式的消息和流平台。具有低延迟、高性能、高可靠性、万亿级别吞吐量、以及弹性扩展能力。它主要由4部分组成:name server, broker, producer和consumer。这4者中的每一个都可以多节点部署以消除单点故障。

Name Server集群

Name Servers提供轻量级的服务发现和路由功能。每个name server节点都记录了完整的路由信息,并提供了响应的读写接口服务。并且可以快速的横向扩容。

Broker集群

Brokers通过轻量级的TOPIC和QUEUE机制来负责消息的存储。broker提供pull和push两种模型,包括失败容忍机制(2 copies or 3 copies),提供强大的峰值填充功能,并能够按原始时间顺序累积数千亿条消息(笔者注:压测的时候很有用)。 此外,brokers提供了灾难恢复,丰富的metrics统计、以及告警机制,这些都是以往传统消息系统中缺失的地方。

Producer和Consumer集群

Producer支持分布式部署,分布式的生产者通过多种负载均衡策略发送消息给broker集群。发送的过程支持快速失败并且是低延迟的。
Consumers支持以push和pull两种方式进行分布式部署。它支持两种消息消费方式:集群消息和广播消息。它提供实时的消息订阅机制,可以满足绝大部分消费需求。RocketMQ的官网上提供了一些quick-start指南给感兴趣的读者。

NameServer

NameServer是一个完全功能性的服务端,有两个作用:

  • Broker管理, NameServer从broker集群接收注册然后提供心跳机制确认broker是否存活。
  • 路由管理,每个NameServer都持有整个broker集群的路由信息、以及供客户端使用的完整的队列信息。

我们已经知道了,RocketMQ客户端(生产者和消费者)是从NameServer查询对应的投递和消费所需的队列的信息的,但是客户端又是如何先找到NameServer的呢?
有4种方法在客户端中配置NameServer的地址列表:

  • 通过代码的方式,比如 producer.setNamesrvAddr("ip:port")
  • 通过Java Options,rocketmq.namesrv.addr
  • 使用环境变量,NAMESRV_ADDR
  • 通过Http Endpoint

Broker Server

Broker server主要负责消息的存储和投递,消息的查询,高可用机制等等。
如前面的架构图所示,Broker server有如下重要的子模块:

  • Remoting Module, 是broker的入口部分,负责处理来自客户端的请求。
  • Client Manager, 负责管理各个客户端(Producer/Consumer),并维持消费者与topic的订阅关系。
  • Store Service, 提供对物理磁盘上的消息进行存储和查询的基础API.
  • HA Service, 高可用模块,提供master broker与slave broker之间的数据同步机制。
  • Index Service, 构建消息按特定key的索引、以及消息的快速查询。

原文:http://rocketmq.apache.org/docs/rmq-arc/

后记

笔者认为对于RocketMQ的架构有几个核心的技术点:
1. 首先,最重要的是Broker的Strore Service模块。虽然也是做了异步刷盘,但是高性能的磁盘读写能力也是这个系统架构高性能和高吞吐量的关键。值得深入研究。
2. 其次,由NameServer提供(producer和consumer配合完成)的Topic路由机制,也就是所谓的这个分布式系统的协调功能。协调生产者集群和消费者集群,从各个topic对应的MessageQueue中投递和拉取消息。
3. 再来就是作为一个分布式系统所需要的网络通信底座了,基于netty开发。

举报

相关推荐

0 条评论