消息队列系列(一)关于RocketMQ双主架构的设计思考

本文探讨了消息队列在高并发环境中的作用,如解耦、削峰、异步和最终一致性,并逐步演进了一款分布式消息组件的设计,从单节点到多主从部署,引入注册中心。RocketMQ的网络拓扑和工作流程也被详细解析,NameServer作为注册中心,Broker作为消息承载点,确保高可用性和容错性。
摘要由CSDN通过智能技术生成

大家好,我是Idea!
最近在整理一些关于消息队列相关的知识点,所以开启了现在这个篇目。

本篇主要从RocketMQ的整体设计进行入手分析,不会有太过多源码层面的讲解,尽量通过一些图文的方式来带大家深入理解RocketMQ内部的一些设计细节。

ps:关于如何使用RocketMQ发送和消费消息的部分这里就直接略过了,这些比较基础的入门级别内容大家可以直接到RocketMQ的官网上去学习了解。下边是对应的官网地址:

https://rocketmq.apache.org/docs/motivation/

如果要设计一款消息组件,你会如何设计它的基本架构
在开始介绍RocketMQ的网络拓扑图之前,我们先从原始的设计开始构思,如果要让我们手动编码实现一款消息平台的产品,那么需要考虑哪些点?下边给出一些我个人的思考:

如何理解消息队列?

随着互联网流量的日渐爆发,高吞吐,高可用,高性能已经成了每个互联网公司内部都会遇到一个难题,而消息队列也是在互联网爆发之后所催生的一种产品。

ps: 其实很早的时候在操作系统的内部也有消息队列的设计,它被作为了进程间通信的方式之一,感兴趣的小伙伴可以去了解下System V消息队列的设计。
相关设计的原理图大致如下:
在这里插入图片描述

更多底层细节可以去查看这篇文章,本文中就不做过多扩展:

https://www.cnblogs.com/Anker/archive/2013/01/07/2848869.html

消息队列在企业中落地的设计目的

解耦:降低微服务间系统调用的强耦合问题
削峰:解决高并发请求对业务下游的冲击
异步:可以适用于一些异步场景
最终一致性:保证消息的消费结果能够达到最终一致。

参考Linux内核的消息队列设计,下边给出基于分布式环境部署的消息队列设计思路:

Version 1 单消息承载节点部署版本

在这里插入图片描述
思考:如果消息承载点挂了怎么办?这没法解决高可用问题啊。

Version 2 多消息承载节点部署版本

在这里插入图片描述

消息发送方往多个消息承载点发送同一条数据,保证单个节点挂了之后,还会有节点可以用于承载消息,然后consumer从消息承载点获取消息。
思考:多个承载点之间的数据一致性该如何解决?
通常解决这类设计问题的主要方案就是选出一个leader角色,所以不妨可以尝试使用主从的思维去设计优化。

Version 3 多消息承载节点+主从部署版本

在这里插入图片描述

加入了主从关系之后,消息承载点的支撑能力开始有所提升,consumer可以从主节点和从节点读取消息,这样能保证两种情况下消息消费的可靠性:

  • 主节点挂了,消息可以从从节点读取
  • 从节点网络异常了,消息可以从主节点读取

思考:通常我们的主从集群部署都会存放在一个机柜内部从而降低网络延迟,但是如果一旦出现了机房断电,那么整个集群都会挂掉,该如何避免这类情况?

Version 4 多消息承载节点+多主从部署版本

在这里插入图片描述

Producer发送消息的时候往两个主节点去写入,两套主从分别部署在不同的机柜,这样保证即使断电了也不影响线上业务的使用。

思考:面对这么多的消息承载点,producer怎么知道消息该发送给哪个ip呢?当承载点挂了,producer又该如何跟换发送消息的目标地址呢?

Version 5 多消息承载节点+多主从部署+注册中心版本

在这里插入图片描述

所有的消息承载节点都将地址信息上报到注册中心(集群部署)中,produer发送消息的时候聪注册中心获取需要发送消息的承载点地址即可。另外消息承载点需要和注册中心定期上报健康数据,保证节点的高可用性。consumer也是从注册中心获取所有消息承载点的地址信息。

目前来看似乎可以将这套设计方案落地到实际企业应用中了。如果你看懂了上边几个版本的消息队列演进设计图,那么再来看下RocketMQ的集群部署网络拓扑图就不会觉得复杂了。

RocketMQ网络拓扑图

在这里插入图片描述

图中的NameServer其实就是我在前边提到的注册中心这个概念,Broker可以理解为我在前边提到的消息承载点概念。

下边是我从Github上摘选的一段关于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建立连接通道,开始消费消息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RocketMQ 是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会,并于2017年9月25日成为Apache 的顶级项目。作为经历过多次阿里巴巴双十一这种“超级工程”的洗礼并有稳定出色表现的国产中间件,以其高性能、低延时和高可靠等特性近年来已经也被越来越多的国内企业使用。其主要功能有1.灵活可扩展性、2.海量消息堆积能力、3.支持顺序消息、4.多种消息过滤方式、5.支持事务消息、6.回溯消费等常用功能。RocketMQ 核心的四大组件:Name Server、Broker、Producer、Consumer ,每个组件都可以部署成集群进行水平扩展。2、适应人群有一定的Java基础,并且有分布式项目开发经验。3、课程价值可以让初学者对分布式系统解耦有一定认识,并且能够通过快速使用RocketMQ实现分布式服务的异步通信,同时本课程还会通过项目案例实战让学员对RocketMQ的应用场景有所体会,最后再通过源码角度让学员对RocketMQ的原理有所理解,不仅做到“知其然”,亦“知其所以然”。4、课程收获1. 理解消息中间件MQ的优势和应用场景2. 掌握RocketMQ的核心功能,以及各种消息发送案例3. 通过电商项目深刻理解RocketMQ在使用项目中的落地应用4. 通过RocketMQ高级功能和源码学习,对RocketMQ的技术细节和原理有更加透彻的理解5、课程亮点l  核心功能n  MQ介绍n  环境准备n  RocketMQ高可用集群搭建n  各种消息发送样例l  综合练习n  项目背景介绍n  功能分析n  项目环境搭建n  下单功能,保证各服务的数据一致性n  确认订单功能,通过消息进行数据分发n  整体联调l  高级功能n  消息的存储和发送n  消息存储结构n  刷盘机制n  消息的同步复制和异步复制n  负载均衡l  源码分析n  路由中心NameServern  消息生产者Producern  消息存储n  消息消费Consumer6、主讲内容章节一:核心功能1.     快速入门a)     MQ介绍b)     作用c)      注意事项d)     各MQ产品比较2.     RocketMQ环境搭建a)     环境准备b)     安装RocketMQc)      启动RocketMQd)     测试RocketMQe)     关闭RocketMQ3.     RocketMQ高可用集群搭建a)     集群各角色介绍b)     集群搭建方式c)      双主双从集群搭建d)     集群监控平台4.     各种消息发送样例a)     同步消息b)     异步消息c)      单向消息d)     顺序消息e)     批量消息f)      过滤消息g)     事务消息章节二:项目实战1.    项目背景介绍(1)    电商高可用MQ实战2.    功能分析(1)    下单功能(2)    支付功能3.    项目环境搭建(1)    SpringBoot(2)    Dubbo(3)    Zookeeper(4)    RocketMQ(5)    Mysql4.下单功能,保证各服务的数据一致性5.确认订单功能,通过消息进行数据分发章节三:高级功能1. 消息的存储和发送2. 消息存储结构3. 刷盘机制(1)    同步刷盘(2)    异步刷盘4. 消息的同步复制和异步复制5. 负载均衡(1)    Producer负载均衡(2)    Consumer负载均衡章节四:源码分析1.     路由中心NameServera)     NameServer架构设计b)     NameServer启动流程c)      NameServer路由注册和故障剔除2.     消息生产者Producera)     生产者启动流程b)     生产者发送消息流程c)      批量发送3.     消息存储a)     消息存储流程b)     存储文件与内存映射c)      存储文件d)     实时更新消息消费队列和存储文件e)     消息队列与索引文件恢复f)      刷盘机制4.     过期文件删除机制a)     消息消费Consumerb)     消费者启动流程c)      消息拉取d)     消息队列负载均衡和重新分布机制e)     消息消费过程f)      定时消息机制g)     顺序消息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值