RocketMQ消息中间件的使用
文章目录
为什么选择 RocketMQ?
根据我们的研究,随着使用中队列和虚拟主题的增加,ActiveMQ IO 模块达到了瓶颈。我们尽力通过节流、断路器或降级来解决这个问题,但效果不佳。所以我们开始关注当时流行的消息传递解决方案Kafka。不幸的是,Kafka 无法满足我们的要求,尤其是在低延迟和高可靠性方面,请参阅此处了解详细信息。
在这种情况下,我们决定发明一个新的消息传递引擎来处理更广泛的用例集,从传统的发布/订阅场景到大容量实时零丢失容忍交易系统。我们相信这个解决方案可能是有益的,因此我们希望将其开源给社区。如今,已有 100 多家公司在其业务中使用开源版本的 RocketMQ。
消息队列是一种“先进先出”的数据结构
其应用场景主要包含以下3个方面
1. 应用解耦
系统的耦合性越高,容错性就越低。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。
使用消息队列解耦合,系统的耦合性就会提高了。比如物流系统发生故障,需要几分钟才能来修复,在这段时间内,物流系统要处理的数据被缓存到消息队列中,用户的下单操作正常完成。当物流系统回复后,补充处理存在消息队列中的订单消息即可,终端系统感知不到物流系统发生过几分钟故障。
2. 流量削峰
应用系统如果遇到系统请求流量的瞬间猛增,有可能会将系统压垮。有了消息队列可以将大量请求缓存起来,分散到很长一段时间处理,这样可以大大提到系统的稳定性和用户体验。
一般情况,为了保证系统的稳定性,如果系统负载超过阈值,就会阻止用户请求,这会影响用户体验,而如果使用消息队列将请求缓存起来,等待系统处理完毕后通知用户下单完毕,这样总不能下单体验要好。
处于经济考量目的:
业务系统正常时段的QPS如果是1000,流量最高峰是10000,为了应对流量高峰配置高性能的服务器显然不划算,这时可以使用消息队列对峰值流量削峰
3. 数据分发
通过消息队列可以让数据在多个系统更加之间进行流通。数据的产生方不需要关心谁来使用数据,只需要将数据发送到消息队列,数据使用方直接在消息队列中直接获取数据即可
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,没有开放这些端口将访问不了项目
我们这里下载4.9.3版本
素材:RockerMQ素材下载(已经配置好了,跟着下面操作就可以了)
为了方便大家快速的学习,这里准备了素材,也可以跟着文档去官网下载
2、使用Linux进行配置
2.1 使用命令 mkdir 创建 /usr/local/recketMQ 目录
使用命令 cd 跳转到 /usr/local/recketMQ 目录
2.2 使用Xftp打开Xshell当前登录用户进行文件操作
跳转到 /usr/local/recketMQ 目录 进行文件传输
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行,修改如下:
2.5.2 修改runbroker.sh
使用 vim 命令打开 bin/runbroker.sh 文件。未修改前 85行,修改如下:
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编辑器打开查看错误
如下所示是内存没有配置成功,导致内存不足了。需要重新配置
重新配置一下就可以了
启动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
4.1.2 修改配置
修改其src/main/resources中的application.properties配置文件。
原来的端口号为8080,修改为一个不常用的
指定RocketMQ的name server地址
4.1.3 将 rocketmq-dashboard-master 上传到 /usr/local/recketMQ 目录中
使用 cd 命令跳转到 /usr/local/recketMQ 目录
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仓库)
执行命令:
chmod a+x /usr/local/maven/apache-maven-3.6.0/bin/mvn
mvn clean package -Dmaven.test.skip=true
**报错:**其他的大多数是版本问题,版本对应就可以了
**解决:**把 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地址:端口
至此,我们的RocketMQ集成成功了
5、RocketMQ使用
5.1 打开素材中的项目
点击启动项目
5.2 打开 http://localhost:8380/doc.html 接口文档
1. 普通消息
- 进行数据测试(普通消息)
- 控制层代码
- 测试结果
2. 延时消息
- 进行数据测试(延时消息)
- 控制层代码
- 测试结果
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级开始,各级延时的时间,可以修改这个指定级别的延时时间;
时间单位支持:s、m、h、d,分别表示秒、分、时、天;
默认值就是上面声明的,可手工调整;
默认值已够用,不建议修改这个值。
至此,我们RockerMQ的学习也就完成了。