💖10分钟认识RocketMQ!想进阿里连这个都不会?1️⃣💖

简介: MQ(Message Queue)是一种跨进程的通信机制,用于传递消息。通俗点说,就是一个先进先出的数据结构。有点像队列。

一、消息中间件简介


1.1、什么是什么MQ


   MQ(Message Queue)是一种跨进程的通信机制,用于传递消息。通俗点说,就是一个先进先出的数据结构。有点像队列。


1.JPG


1.2、MQ的应用场景


1.2.1、异步解耦


   最常见的一个场景是用户注册后,需要发送注册邮件和短信通知,以告知用户注册成功。传统的做法如下:


2.JPG

 

  此架构下注册、邮件、短信三个任务全部完成后,才返回注册结果到客户端,用户才能使用账号登录。但是对于用户来说,注册功能实际只需要注册系统存储用户的账户信息后,该用户便可以登录,而后续的注册短信和邮件不是即时需要关注的步骤。


所以实际当数据写入注册系统后,注册系统就可以把其他的操作放入对应的消息队列 MQ 中然后马上返回用户结果,由消息队列 MQ 异步地进行这些操作。架构图如下:


3.JPG

 

异步解耦是消息队列 MQ 的主要特点,主要目的是减少请求响应时间和解耦。主要的使用场景就是将比较耗时而且不需要即时(同步)返回结果的操作作为消息放入消息队列。同时,由于使用了消息队列MQ,只要保证消息格式不变,消息的发送方和接收方并不需要彼此联系,也不需要受对方的影响,即解耦合。


1.2.2、流量削峰


   流量削峰也是消息队列 MQ 的常用场景,一般在秒杀或团队抢购(高并发)活动中使用广泛。


   在秒杀或团队抢购活动中,由于用户请求量较大,导致流量暴增,秒杀的应用在处理如此大量的访问流量后,下游的通知系统无法承载海量的调用量,甚至会导致系统崩溃等问题而发生漏通知的情况。为解决这些问题,可在应用和下游通知系统之间加入消息队列 MQ。


4.JPG

   

秒杀处理流程如下所述:


  1. 用户发起海量秒杀请求1到秒杀业务处理系统。
  2. 秒杀处理系统按照秒杀处理逻辑将满足秒杀条件的请求1发送到消息队列MQ。
  3. 下游的通知系统订阅1消息队列MQ的秒杀相关消息,再将1秒杀成功的消息发送到相关用户。
  4. 用户收到秒杀成功的通知。


1.3、常见的MQ产品


   目前业界有很多MQ产品,比较出名的有:ZeroMQ、RabbitMQ、ActiveMQ、RocketMQ、Kafka。


1.3.1、ZeroMQ


   号称最快的消息队列系统,尤其针对大吞吐量的需求场景。扩展性好,开发比较灵活,采用C语言实现,实际上只是一个socket库的重新封装,如果做为消息队列使用,需要开发大量的代码。ZeroMQ仅提供非持久性的队列,也就是说如果down机,数据将会丢失。


1.3.2、RabbitMQ


   使用erlang语言开发,性能较好,适合于企业级的开发。但是不利于做二次开发和维护。


1.3.3、ActiveMQ


   历史悠久的Apache开源项目。已经在很多产品中得到应用,实现了JMS1.1规范,可以和spring-jms轻松融合,实现了多种协议,支持持久化到数据库,对队列数较多的情况支持不好。


1.3.4、RocketMQ


   阿里巴巴的MQ中间件,由java语言开发,性能非常好,能够撑住双十一的大流量,而且使用起来很简单。



1.3.5、Kafka


   Kafka是Apache下的一个子项目,是一个高性能跨语言分布Publish/Subscribe消息队列系统,相对于ActiveMQ是一个非常轻量级的消息系统,除了性能非常好之外,还是一个工作良好的分布式系统。



二、RocketMQ入门


2.2、简介


   RocketMQ是阿里巴巴开源的分布式消息中间件,现在是Apache的一个顶级项目。在阿里内部使用非常广泛,已经经过了"双11"这种万亿级的消息流转。


2.3、下载


RocketMQ官网

github


2.4、Windows安装


下载

   我们先从官网去选择Binary下载,Binary代表是二进制版本,可以直接使用。


5.JPG

解压

6.JPG


  • bin:启动脚本,包括shell脚本和CMD脚本
  • conf:实例配置文件 ,包括broker配置文件、logback配置文件等
  • lib:依赖jar包,包括Netty、commons-lang、FastJSON等


配置环境环境:ROCKETMQ_HOME

   在电脑高级配置(配置jdk那边)配置环境变量,变量名为:ROCKETMQ_HOME,值为:MQ解压路径\MQ文件夹名。


7.JPG


修改配置文件

   进入RocketMQ的conf文件,里面有一个broker.conf配置文件。在文件末尾添加两行。(输入的时候建议将中文去掉)


enablePropertyFilter=true <!--支持标签过滤-->
namesrvAddr=127.0.0.1:9876 <!--server服务的地址-->
复制代码

8.JPG


启动nameserver

   在MQ解压文件的bin目录下进入CMD的1命令行,执执行命令(或者双击mqnamesrv.cmd),启动nameserver,成功后会弹出提示框,不要关闭。


# 执行命令
start mqnamesrv.cmd
复制代码


9.JPG

10.JPG


启动broker

   在bin目录下cmd进入命令行模式,执行命令,启动broker。成功后不要关闭


mqbroker.cmd -c ../conf/broker.conf
复制代码

11.JPG


MQ可视化工具安装

可视化工具下载地址,密码6666


    这个jar一定要JDK8的环境!!下载后修改application.properties文件,修改自己启动的端口和服务的ip+端口。集群按钮1那里出现了版本号说明启动成功!


12.JPG

2.4、Linux安装


   这里使用的不是虚拟机,是阿里云的ECS服务器,系统版本为CentOs7。


上传RocketMQ

   RocketMQ的下载包:密码6666

   将RocketMQ的zip包上传到阿里云服务器,使用命令解压。


unzip /usr/soft/rocketmq-all-4.4.0-bin-release.zip # 这个目录要改为自己的RocketMQ
mv  /usr/soft/rocketmq-all-4.4.0-bin-release/  /usr/soft/rocketmq-4.4/ # 重命名方便管理
复制代码


修改配置文件

   进入RocketMQ的conf目录,修改broker.conf,新增三行(去掉我注释的中文)。


enablePropertyFilter=true  # 支持标签顾过滤消息
namesrvAddr=127.0.0.1:9876  # 你的mqnamesrv地址
brokerIP1=11.11.11.11    # 你的阿里云服务器的公网ip
复制代码


修改启动参数

   因为默认的RocketMQ启动的时候需要的1JVM内存很多,会报错,所以我们将他变小一点即可。默认是1G,修改为512m。


vi  /usr/soft/rocketmq-4.4/bin/runbroker.sh
vi  /usr/soft/rocketmq-4.4/bin/runserver.sh
复制代码


13.JPG


防火墙和安全组开放几个端口

   开放9876、10911、10912、10909以及你指定的可视化工具启动的端口,这里步骤不再赘述,有疑问可以在评论区回复或者翻我的Linux的学习文章进行学习。


启动服务

nohup sh /usr/soft/rocketmq-4.4/bin/mqnamesrv &
nohup sh mqbroker -n localhost:9876 -c ../conf/broker.conf &
复制代码


查看日志

   在RocketMQ的根目录的bin目录中,有一个nohup.out用于存放启动的日志信息。无报错即成功,日志信息和1Windows的差不多。


2.5、RocketMQ的架构


14.JPG


2.6、RocketMQ的核心概念


15.JPG


  • 名字服务Name Server(邮局):消息队列的协调者,Broker向它注册路由信息,同时Producer和Consumer向其获取路由信息,名称服务充当路由消息的提供者。生产者或消费者能够通过名字服务查找各主题相应的Broker IP列表。多个Namesrv实例组成集群,但相互独立,没有信息交换。


  • 代理服务器Broker Server(邮递员):Broker是RocketMQ的核心,消息中转角色,负责存储消息、转发消息。代理服务器在RocketMQ系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。代理服务器也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。


  • 生产者Producer(寄件人):负责生产消息,一般由业务系统负责生产消息。一个消息生产者会把业务应用系统里产生的消息发送到broker服务器。RocketMQ提供多种发送方式,同步发送、异步发送、顺序发送、单向发送。同步和异步方式均需要Broker返回确认信息,单向发送不需要。


  • 消费者Consumer(收件人):负责消费消息,一般是后台系统负责异步消费。一个消息消费者会从Broker服务器拉取消息、并将其提供给应用程序。从用户应用的角度而言提供了两种消费形式:拉取式消费、推动式消费。


  • Topic(省份):用来区分不同类型的消息,表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ进行消息订阅的基本单位。


  • 标签Tag:为消息设置的标志,用于同一主题下区分不同类型的消息。来自同一业务单元的消息,可以根据不同业务目的在同一主题下设置不同标签。标签能够有效地保持代码的清晰度和连贯性,并优化RocketMQ提供的查询系统。消费者可以根据Tag实现对不同子主题的不同消费逻辑,实现更好的扩展性。


  • 消息队列MessageQueue(邮件):为了提高性能和吞吐量,引入了Message Queue,一个Topic可以设置一个或多个Message Queue,这样消息就可以并行往各个Message Queue发送消息,消费者也可以并行的从多个 Message Queue读取消息


  • 消息内容Message:息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。RocketMQ中每个消息拥有唯一的Message ID,且可以携带具有业务标识的Key。系统提供了通过Message ID和Key查询消息的功能。


  • 生产者组Producer Group:生产者组,简单来说就是多个发送同一类消息的生产者称之为一个生产者组。


  • 消费者组Consumer Group:消费者组,消费同一类消息的多个 consumer 实例组成一个消费者组。



相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
3天前
|
物联网
MQTT常见问题之用单片机接入阿里MQTT实例失败如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
8月前
|
消息中间件 程序员 Apache
阿里RocketMQ创始人首次分享出这份RocketMQ技术内幕神级架构手册
RocketMQ的发展史? RocketMQ的开源正是源于对这种开源文化的认同,开放是为了更好的协同创新,并将这一技术推向新的高度。在经历了阿里巴巴集团内部多年“双11”交易核心链路工业级场景在验证,2016年11月,团队将RocketMQ捐献给全球享有盛誉的Apache软件基金会正式质为孵化项目。 至此,RocketMQ开启了迈向全球顶级开源软件的新征程。
|
9月前
|
消息中间件 中间件 Kafka
限时开源!阿里内部消息中间件合集:MQ+Kafka+体系图+笔记
近好多小伙伴说在准备金三银四的面试突击了,但是遇到消息中间件不知道该怎么学了,问我有没有成体系的消息中间件的学习方式。 额,有点不知所措,于是乎小编就想着做一次消息中间件的专题,归类整理了一些纯手绘知识体系图、面试以及相关的学习笔记。
204 1
|
消息中间件 运维 Kubernetes
阿里的 RocketMQ 如何让双十一峰值之下 0 故障?
2020 年双十一交易峰值达到 58.3 W 笔/秒,消息中间件 RocketMQ 继续数年 0 故障丝般顺滑地完美支持了整个集团大促的各类业务平稳。
140 0
阿里的 RocketMQ 如何让双十一峰值之下 0 故障?
|
消息中间件 存储 负载均衡
阿里IM技术分享(九):深度揭密RocketMQ在钉钉IM系统中的应用实践
在钉钉的IM中,我们通过 RocketMQ实现了系统解耦、异步削峰填谷,还通过定时消息实现分布式定时任务等高级特性。同时与 RocketMQ 深入共创,不断优化解决了很多RocketMQ本身的问题,并且孵化出 POP 消费模式等新特性,使 RocketMQ 能够完美支持对性能稳定性和时延要求非常高的 IM 系统。本文将为你分享这些内容。
304 0
阿里IM技术分享(九):深度揭密RocketMQ在钉钉IM系统中的应用实践
|
消息中间件 缓存 RocketMQ
阿里二面:RocketMQ 集群 Broker 挂了,会造成什么影响?
阿里二面:RocketMQ 集群 Broker 挂了,会造成什么影响?
362 0
阿里二面:RocketMQ 集群 Broker 挂了,会造成什么影响?
|
消息中间件 存储 Java
阿里二面:RocketMQ 消费失败了,怎么处理?
阿里二面:RocketMQ 消费失败了,怎么处理?
441 2
阿里二面:RocketMQ 消费失败了,怎么处理?
|
消息中间件 缓存 算法
阿里二面:RocketMQ 消息积压了,增加消费者有用吗?
阿里二面:RocketMQ 消息积压了,增加消费者有用吗?
213 0
阿里二面:RocketMQ 消息积压了,增加消费者有用吗?
|
消息中间件 存储 RocketMQ
阿里二面:RocketMQ同一个消费组内的消费者订阅量不同tag,会有问题吗?
阿里二面:RocketMQ同一个消费组内的消费者订阅量不同tag,会有问题吗?
661 0
阿里二面:RocketMQ同一个消费组内的消费者订阅量不同tag,会有问题吗?
|
消息中间件 算法 Java
弥补延时消息的不足,RocketMQ 基于时间轮算法实现了定时消息!
弥补延时消息的不足,RocketMQ 基于时间轮算法实现了定时消息!
631 1
弥补延时消息的不足,RocketMQ 基于时间轮算法实现了定时消息!