一、MQ介绍
1、什么是MQ?为什么要用MQ?
是一种FIFO的数据结构。生产者发送消息到MQ进行排队,然后按原来的顺序由消费者进行处理。
作用主要有以下三个方面:
异步:提升系统的响应速度、吞吐量
解耦:服务解耦,可以减少服务间的影响,提升整体的稳定性以及可扩展性。另外解耦可以实现数据分发,消息的消费者变化对生产者没有影响。
削峰:应对突发的流量冲击。
2、MQ的优缺点
系统可用性降低:引用的组件越多,系统的稳定性就会变差,所以需要考虑MQ的高可用。
系统复杂度提高:以前的同步调用变为异步调用,数据的链路就会变得复杂。同时会引入经典的MQ三大问题,如何保证消费不会丢失?如何保证不会重复消费?如何保证消费的顺序性问题?
消息的一致性问题:
如果节点中某一个节点业务成功,但是平行节点业务失败,是否需要业务回滚或者业务重试?需要考虑消息数据处理的一致性问题。
3、几大MQ产品特点比较
kafka:优点是吞吐量大,性能好,集群高可用。缺点是会丢数据,功能单一。
rabbitMQ:优点是消息可靠性高,功能全面。缺点是吞吐量低,消息积累会影响性能,erlang不好定制,镜像队列高可用冗余。
rocketMQ:高吞吐,高性能,高可用,功能全面。缺点配置上有点小复杂。
二、RocketMQ快速实战
1、下载并安装rocketMQ 4.9.2
unzip rocketmq-all-4.9.2-source-release.zip
cd rocketmq-all-4.9.2/
mvn-Prelease-all-DskipTestscleaninstall-U
cd distribution/target/rocketmq-4.9.2/rocketmq-4.9.2\
2、启动namesrv
nohup sh bin/mqnamesrv &
--查看日志
tail -f ~/logs/rocketmqlogs/namesrv.log\
3、启动broker
--指定配置文件
nohup sh bin/mqbroker -c broker-config-a/b/a-s/b-s.properties &
OR
--指定端口
nohup sh bin/mqbroker -n localhost:9876 &
tail -f ~/logs/rocketmqlogs/broker.log\ --查看日志
注意:官方的两个类没有指定nameSrv,所以运行可能有问题,可以创建环境变量NAMESRV_ADDR或者放入.bashrc中,亦或直接临时指定
4、机器服务器配置
| 服务器名 | nameSrv | broker |
|---|---|---|
| serverA | nameSrv1 | |
| serverB | nameSrv2 | broker-a, broker-b-s |
| serverC | nameSrv3 | broker-b, broker-a-s |
使用serverA,serverB,serverC作为三台nameSrv的集群,同时在serverB和serverC上面分别部署对应的slave备份broker
5、启动rockermq控制台
JAVA -jar rockermq-console-ng-1.0.1.jar &
6、登录8080端口查看控制台
7、可以使用自带的tools.sh工具往mq中测试发送1k条消息
--生产消息
bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
--消费消息
bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer