概述
RocketMQ 是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会,并于2017年9月25日成为 Apache 的顶级项目。作为经历过多次阿里巴巴双十一这种“超级工程”的洗礼并有稳定出色表现的国产中间件,以其高性能、低延时和高可靠等特性近年来已经也被越来越多的国内企业使用。
为什么用mq?
不用mq,程序间直接通信,耦合度高。而使用mq可以实现应用解耦、流量削峰、内容分发(发布订阅)
应用解耦:
系统的耦合性越高,容错性就越低。以电商应用为例,用户创建订单后,如果耦合调用库存系统,物流系统,支付系统,任何一个子系统出现了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户体验。
使用消息队列解耦合,系统的可用性就能提高了,比如物流系统发生故障,需要几分钟来修复,再这段时间内,物流系统要处理的数据被缓存到消息队列中,用户的下单操作依然能正常完成。当物流系统恢复后,补充处理存在消息队列中的订单消息即可,终端系统感知不到物流系统发生过几分钟的故障。
下图是使用mq之后的流程图。
流量削峰:
秒杀场景,一下子流量就来了,很容易击垮数据库
应用系统如果遇到请求流量的瞬间猛增,有可能会将系统击垮。有了消息队列就可以将大量请求缓存起来,分散到很长一段时间慢慢处理,这样可以大大提高系统的稳定性和用户体验。
有了MQ以后系统流程图是上面这个样子。一般情况,为了保证系统的稳定性,系统会设置一个阈值,如果超过这个阈值就阻止用户请求,这样会影响用户体验,如果用了消息队列将请求缓存起来,等待系统处理完成以后再通知用户下单完成,这样总比不能下单体验好。并且处于经济考量目的,业务系统正常QPS如果是1000,流量最高峰是10000,为了应对流量高峰配置高性能的服务器是不划算的,这是使用消息队列还是比较经济实惠的。
内容分发(发布订阅):
没用MQ:
使用MQ:
通过消息队列可以让数据再多个系统进行交流,数据的产生方不需要关心谁来使用数据,只需要将消息发送到消息队列,数据使用方订阅消息,直接在消息队列中获取数据即可。
总结RocketMQ优缺点
优点:
解耦,削峰,数据分发
缺点:
系统可用性降低:系统引入的外部依赖越多,系统稳定性就越差,一旦MQ宕机,就会对业务造成影响,但是可以搭建MQ集群实现高可用
系统复杂度提高:MQ的加入大大增加了系统的复杂度,以前系统间是同步远程调用,现在用mq进行异步调用。
快速入门
1、下载压缩包:
下载地址:https://mirror-hk.koddos.net/apache/rocketmq/4.7.1/rocketmq-all-4.7.1-bin-release.zip
环境要求:
Linux 64位
jdk 1.8
Maven 3.2.x
2、上传解压包到服务器
目录结构:
目录介绍:
conf文件夹
将rocketmq 安装到usr/local/rocketmq中:
将解压的rocket文件夹复制到usr/local/rocketmq 目录下
3、启用RocketMQ
启动RocketMQ分为三个步骤:(启动NameServer、启动Broker)
步骤一:启动NameServer
tip:如果发现没有nohup命令参考:https://blog.csdn.net/qq_40241957/article/details/98584207
启动成功:nohup sh mqnamesrv &
tip:我刚开始这里启动失败了,看了下bin目录下的nohup.out信息,提示说内存不足,然后给虚拟机加大了内存
就起来了,也可以参考网上的设置,把内存配置小点
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx512m -Xmn256m -XX:MaxMetaspaceSize=320m -XX:MetaspaceSize=128m"
编辑bin目录下runserver.sh文件设置内存:
启动成功 日志会产生在~/logs/rocketmqlogs
查看日志:tail -f ~/logs/rocketmqlogs/namesrv.log
步骤二:启动Broker
进入rocket目录,启动broker的时候,会去连接NameServer
启动:nohup sh bin/mqbroker -n localhost:9876 &
查看启动日志:tail -f ~/logs/rocketmqlogs/broker.log
问题1
执行启动命令以后没有看见日志文件,可以使用java 命令:jps查看已启动的java程序
可以发现broker 并没有起来。
原因:rocketMQ 默认的虚拟机内存比较大,导致broker因为内存不足,启动失败。需要编辑两个配置文件,修改jvm内存大小
vi runbroker.sh
vi runserver.sh
参考配置:
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
启动成功:
可以看见日志文件夹多了好多日志
测试RocketMQ 环境是否正常
启动两个窗口,一个充当消息生产者,一个充当消息消费者
测试结果,可以看出
窗口a
窗口b
生产者发送完消息后,程序就结束了,而消费者还在一直等待消费消息。
停止rocketMQ和NameServer
sh bin/mqshutdown namesrv
sh bin/mqshutdown broker
OK,RocketMQ单机版本入门搭建就完成了,下次再介绍RocketMQ集群搭建。
如果你觉得我的文章对你有帮助,请帮忙点赞+关注!!!