RocketMQ消息中间件的使用

RocketMQ消息中间件的使用

为什么选择 RocketMQ?

根据我们的研究,随着使用中队列和虚拟主题的增加,ActiveMQ IO 模块达到了瓶颈。我们尽力通过节流、断路器或降级来解决这个问题,但效果不佳。所以我们开始关注当时流行的消息传递解决方案Kafka。不幸的是,Kafka 无法满足我们的要求,尤其是在低延迟和高可靠性方面,请参阅此处了解详细信息。

在这种情况下,我们决定发明一个新的消息传递引擎来处理更广泛的用例集,从传统的发布/订阅场景到大容量实时零丢失容忍交易系统。我们相信这个解决方案可能是有益的,因此我们希望将其开源给社区。如今,已有 100 多家公司在其业务中使用开源版本的 RocketMQ。

消息队列是一种“先进先出”的数据结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PU64BFpk-1667211673180)(D:/PRD/资料/文档/img/queue1.png)]

其应用场景主要包含以下3个方面

1. 应用解耦

系统的耦合性越高,容错性就越低。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。

请添加图片描述

使用消息队列解耦合,系统的耦合性就会提高了。比如物流系统发生故障,需要几分钟才能来修复,在这段时间内,物流系统要处理的数据被缓存到消息队列中,用户的下单操作正常完成。当物流系统回复后,补充处理存在消息队列中的订单消息即可,终端系统感知不到物流系统发生过几分钟故障。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S7a9idq0-1667211673183)(D:/PRD/资料/文档/img/解耦2.png)]

2. 流量削峰

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x5OVh5X4-1667211673184)(D:/PRD/资料/文档/img/mq-5.png)]

应用系统如果遇到系统请求流量的瞬间猛增,有可能会将系统压垮。有了消息队列可以将大量请求缓存起来,分散到很长一段时间处理,这样可以大大提到系统的稳定性和用户体验。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iweWk9sm-1667211673185)(D:/PRD/资料/文档/img/mq-6.png)]

一般情况,为了保证系统的稳定性,如果系统负载超过阈值,就会阻止用户请求,这会影响用户体验,而如果使用消息队列将请求缓存起来,等待系统处理完毕后通知用户下单完毕,这样总不能下单体验要好。

处于经济考量目的:

业务系统正常时段的QPS如果是1000,流量最高峰是10000,为了应对流量高峰配置高性能的服务器显然不划算,这时可以使用消息队列对峰值流量削峰

3. 数据分发

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-09q0TBBT-1667211673186)(D:/PRD/资料/文档/img/mq-1.png)]

通过消息队列可以让数据在多个系统更加之间进行流通。数据的产生方不需要关心谁来使用数据,只需要将数据发送到消息队列,数据使用方直接在消息队列中直接获取数据即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nN4Nn9br-1667211673187)(D:/PRD/资料/文档/img/mq-2.png)]

4. MQ的优点和缺点

优点:解耦、削峰、数据分发

缺点包含以下几点:

  • 系统可用性降低

    系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响。

    如何保证MQ的高可用?

  • 系统复杂度提高

    MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行异步调用。

    如何保证消息没有被重复消费?怎么处理消息丢失情况?那么保证消息传递的顺序性?

  • 一致性问题

    A系统处理完业务,通过MQ给B、C、D三个系统发消息数据,如果B系统、C系统处理成功,D系统处理失败。

    如何保证消息数据处理的一致性?

5. RocketMQ vs. ActiveMQ vs. Kafka之间有什么不同
消息产品 客户端 SDK 协议和规范 订购信息 预定消息 批量消息 广播消息 消息过滤器 服务器触发的重新交付 消息存储 消息追溯 消息优先级 高可用性和故障转移 消息跟踪 配置 管理和运营工具
ActiveMQ Java、.NET、C++ 等。 推送模型,支持 OpenWire、STOMP、AMQP、MQTT、JMS Exclusive Consumer 或 Exclusive Queues 可以保证排序 支持的 不支持 支持的 支持的 不支持 使用 JDBC 和高性能日志支持非常快速的持久化,例如 levelDB、kahaDB 支持的 支持的 支持,取决于存储,如果使用 levelDB 则需要 ZooKeeper 服务器 不支持 默认配置为低级,用户需优化配置参数 支持的
kafka Java、Scala 等。 拉取模型,支持TCP 确保分区内消息的排序 不支持 支持,带有异步生产者 不支持 支持,可以使用Kafka Streams过滤消息 不支持 高性能文件存储 支持的偏移量指示 不支持 支持,需要 ZooKeeper 服务器 不支持 Kafka 使用键值对格式进行配置。这些值可以从文件或以编程方式提供。 支持,使用终端命令公开核心指标
RocketMQ Java、C++、围棋 拉取模型,支持 TCP、JMS、OpenMessaging 确保消息的严格排序,并且可以优雅地横向扩展 支持的 支持,具有同步模式以避免消息丢失 支持的 支持的基于 SQL92 的属性过滤器表达式 支持的 高性能和低延迟的文件存储 支持的时间戳和偏移量两种表示 不支持 支持的主从模型,无需其他套件 支持的 开箱即用,用户只需注意一些配置 支持的、丰富的 Web 和终端命令以公开核心指标

官网地址:https://rocketmq.apache.org/

1、下载RocketMQ安装包

**要求:**准备工作

软硬件需求

  • Linux64位系统
  • JDK1.8(64位)
  • 源码安装需要安装Maven 3.2.x
  • **注意:**集成RocketMQ需要开放的端口: 9876,10912,10911,10909,没有开放这些端口将访问不了项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5PU3mwwb-1667211673188)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221025085826308.png)]

我们这里下载4.9.3版本

素材:RockerMQ素材下载(已经配置好了,跟着下面操作就可以了)

为了方便大家快速的学习,这里准备了素材,也可以跟着文档去官网下载

2、使用Linux进行配置

2.1 使用命令 mkdir 创建 /usr/local/recketMQ 目录

使用命令 cd 跳转到 /usr/local/recketMQ 目录

2.2 使用Xftp打开Xshell当前登录用户进行文件操作

跳转到 /usr/local/recketMQ 目录 进行文件传输

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gSU0fKYL-1667211673189)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221029171601892.png)]

2.3 使用 unzip rocketmq-all-4.9.3-source-release.zip 进行解压文件

需要先下载unzip解压工具,命令: yum install unzip

2.4 使用 cd 跳转到 /usr/local/recketMQ/rocketmq-4.9.3 目录

使用 ll 查看当前目录下文件详情

2.5、修改初始内存

RocketMQ 默认的虚拟机内存较大,启动 Broker 或者 NameServer 可能会因为内存不足而导致失败,所以需要编辑如下两个配置文件,修改 JVM 内存大小

2.5.1、修改runserver.sh

使用 vim 命令打开 bin/runserver.sh 文件。未修改前 71,76行,修改如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sMYpA42f-1667211673190)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220825194822525.png)]

2.5.2 修改runbroker.sh

使用 vim 命令打开 bin/runbroker.sh 文件。未修改前 85行,修改如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZI8jSdDK-1667211673191)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221025154050923.png)]

3、启动RocketMQ服务

nohup 意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行。

3.1 启动NameServer
nohup sh bin/mqnamesrv & 

tail -f ~/logs/rocketmqlogs/namesrv.log 

启动nameserver成功

3.2 启动broker
nohup sh bin/mqbroker -n 192.168.230.128:9876  &

配置broker文件之后使用:nohup sh bin/mqbroker -n 192.168.230.128:9876 -c /usr/local/recketMQ/rocketmq-4.9.3/conf/broker.conf &

tail -f ~/logs/rocketmqlogs/broker.log 

启动broker失败,

在这里插入图片描述

右击nohup.out文件使用EditPlus编辑器打开查看错误

如下所示是内存没有配置成功,导致内存不足了。需要重新配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i1EkbsDz-1667211673192)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221025153302236.png)]

重新配置一下就可以了

启动broker成功

3.3 发送/接收消息测试

发送消息

export NAMESRV_ADDR=192.168.230.128:9876 

sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer

接收消息

sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer 

3.4 关闭Server

无论是关闭name server还是broker,都是使用 bin/mqshutdown 命令。

[root@mqOS rocketmq]# 关闭broker服务命令: sh bin/mqshutdown broker 

The mqbroker(1740) is running..	. 

Send shutdown request to mqbroker(1740) OK 

[root@mqOS rocketmq]# 关闭nameserver服务命令: sh bin/mqshutdown namesrv 

The mqnamesrv(1692) is running... 

Send shutdown request to mqnamesrv(1692) OK 

[2]+ 退出 143 nohup sh bin/mqbroker -n localhost:9876 

4、控制台安装与启动

RocketMQ有一个可视化的dashboard,通过该控制台可以直观的查看到很多数据。

**如果不想去官网下载,那么可以直接使用素材提供的控制台(已经配置好了)**跟着下面操作就可以了

4.1安装
4.1.1 下载

下载地址:https://github.com/apache/rocketmq-dashboard

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SrccosQn-1667211673193)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221025160927143.png)]

4.1.2 修改配置

修改其src/main/resources中的application.properties配置文件。

原来的端口号为8080,修改为一个不常用的

指定RocketMQ的name server地址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E0dMXTXl-1667211673194)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221031150825807.png)]

4.1.3 将 rocketmq-dashboard-master 上传到 /usr/local/recketMQ 目录中

使用 cd 命令跳转到 /usr/local/recketMQ 目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7h60Wxgu-1667211673195)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221029173635009.png)]

4.1.4 使用 unzip 对 rocketmq-dashboard-master 进行解压

4.1.5 使用 cd 命令跳转到 /usr/local/recketMQ/rocketmq-dashboard-master 目录

4.2 启动
4.2.1 前端打包

注释打包插件 frontend-maven-plugin

<!--            <plugin>-->
<!--                <groupId>com.github.eirslett</groupId>-->
<!--                <artifactId>frontend-maven-plugin</artifactId>-->
<!--                <version>1.11.3</version>-->
<!--	        </plugin>-->
4.2.2 后端打包

在rocketmq-dashboard-master目录下运行maven的打包命令。(注:要在虚拟机准备好maven仓库)

Maven安装网址

执行命令:

chmod a+x /usr/local/maven/apache-maven-3.6.0/bin/mvn
mvn clean package -Dmaven.test.skip=true

**报错:**其他的大多数是版本问题,版本对应就可以了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BmcRJQDq-1667211673195)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220810163446732.png)]

**解决:**把 frontend-maven-plugin 插件注释就可以了

<!--            <plugin>-->
<!--                <groupId>com.github.eirslett</groupId>-->
<!--                <artifactId>frontend-maven-plugin</artifactId>-->
<!--                <version>1.11.3</version>-->
<!--            </plugin>-->
4.2.2 启动

使用 cd 命令跳转到 /usr/local/recketMQ/rocketmq-dashboard-master/target 目录

执行命令:

nohup java -jar rocketmq-dashboard-1.0.1-SNAPSHOT.jar &

4.2.3 访问

使用 http://IP地址:端口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kpBnWehM-1667211673196)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221031173214440.png)]

至此,我们的RocketMQ集成成功了

5、RocketMQ使用

5.1 打开素材中的项目

在这里插入图片描述

点击启动项目

5.2 打开 http://localhost:8380/doc.html 接口文档
1. 普通消息
  1. 进行数据测试(普通消息)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pKZvlUmB-1667211673197)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221031173849911.png)]

  1. 控制层代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xBNkp3iq-1667211673198)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221031173817310.png)]

  1. 测试结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ishLsjLp-1667211673199)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221031174135268.png)]

2. 延时消息
  1. 进行数据测试(延时消息)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z1AC8IrX-1667211673199)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221031174428528.png)]

  1. 控制层代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xtTMWqd9-1667211673199)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221031174517264.png)]

  1. 测试结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gsRihc5y-1667211673200)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221031174504570.png)]

6、自定义延时时间等级

在服务器端(rocketmq-broker端)的属性配置文件broker.conf中加入以下行:

messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
描述了各级别与延时时间的对应映射关系。

  1. 这个配置项配置了从1级开始,各级延时的时间,可以修改这个指定级别的延时时间;

  2. 时间单位支持:s、m、h、d,分别表示秒、分、时、天;

  3. 默认值就是上面声明的,可手工调整;

  4. 默认值已够用,不建议修改这个值。

至此,我们RockerMQ的学习也就完成了。

猜你喜欢

转载自blog.csdn.net/ITKidKid/article/details/127620821