RocketMQ
一、什么是MQ?
- MQ:MessageQuery,消息队列。队列,是一种FIFO先进先出的数据结构。消息由生产者发送到MQ进行排队,然后按原来的顺序交由消息的消费者进行处理。QQ,微信就是典型的MQ。
二、引入MQ的优点
- 异步:异步能提高系统的相应速度,吞吐量。
- 解耦:服务之间进行解耦,才可以减少服务之间的影响。提高系统整体的稳定性一阶可扩展性
- 削峰:以稳定的系统资源对突发的流量的冲击。
三、引入MQ的缺点
- 系统可用性降低:系统引入外部依赖增多,系统的稳定性就会变差。一旦MQ宕机,就会对业务产生影响。这就需要考虑如何保证MQ的高可用性。
- 系统的复杂度提高:引入MQ后系统的复杂度会大大提高。以前服务之间可以进行同步的服务调用,引入MQ后,会变为异步调用,数据的链路就会变得更加复杂。并且还会带来其他的一些问题。比如:如何保证消费不会丢失?不会被重复调用?怎么保证消息的顺序行等问题。
- 消息一致性问题:A系统处理完业务,通过MQ发送消息给B,C系统进行后续的业务处理。如果B系统处理成功,C系统处理失败怎么办?这就需要考虑如何保证消息数据处理的一致性(分布式事务)。
四、几大MQ产品特点比较
五、安装环境
1.准备环境
# 移动
mv jdk-8u171-linux-x64.tar.gz /usr/local/java/jdk-8u171-linux-x64.tar.gz
# 解压jdk和RocketMQ
tar -zxvf jdk-8u171-linux-x64.tar.gz
yum install zip #压缩
yum install unzip #解压缩
unzip rocketmq-all-4.6.0-bin
2.配置环境
# 配置环境变量
vi /etc/profile
# JDK环境变量
export JAVA_HOME=/usr/local/java/jdk1.8.0_171
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#set rocketMQ environment
export ROCKETMQ_HOME=/usr/local/src/rocketmq-all-4.6.0-bin
export PATH=$PATH:$ROCKETMQ_HOME/bin:$PATH
# 使profile生效
source /etc/profile
# 验证jdk是否安装成功
java -version
vim runserver.sh #修改runserver.sh文件(默认4G)
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:PermSize=128m -XX:MaxPermSize=320m"
vim runbroker.sh #修改runbroker.sh文件
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:PermSize=128m -XX:MaxPermSize=320m"
vim tools.sh #修改tools.sh文件
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn256m -XX:PermSize=128m -XX:MaxPermSize=128m"
3.启动RocketMQ:
# 后台启动运行 mqnamesrv
nohup sh bin/mqnamesrv > /iubbo/rocketMQ/logs/mqnamesrv.out 2>&1 &
# 检查启动
tail mqnamesrv.out
# 或
jps
# 启动broker
# 默认会读取 /conf 目录下的 broker.conf 配置文件
less broker.conf
# 修改:
autoCreateTopicEnable=true
#aclEnale=true
# 启动:
nohup bin/mqbroker -c conf/broker.conf > /iubbo/rocketMQ/logs/mqbroker.out 2>&1 &
# 检查启动
tail nohup.out
4.命令快速验证
# 启动生产者
# 向环境变量配置的端口发送1000条消息
export NAMESRV_ADDR=localhost:9876
bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
# 启动消费者
export NAMESRV_ADDR=localhost:9876
bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
5.RocketMQ 图形化( 社区扩展项目)
GitHub: rocket-externals rocketmq-console
java -jar target/rocketmq-console-ng-2.0.0.jar --server.port=6566 --rocketmq.config.namesrvAddr=127.0.0.1:9876
六、RocketMQ集群搭建
1.集群特点
- NameServer :是无状态的,brocker会给每个NameServer上报消息;
- Producer :相互之间是没有数据同步的,Consumer同;随机选取一个NameServer建立长链接,定期从NameServer获取Topic路由的信息。同时定时向NameServer发送心跳检测。
- Broker :主从集群,Master为主,Slave为从;Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示为master,
非0表示为Slave。Master也可部署多个。每个Broker与BrokerName集群中的所有节点建立长链接,定时注册Topic信息到所有的NameServer.
2.集群模式
- 单Master模式
- 多Master模式
- 多Master多Slave(异步)
- 多Master多Slave(同步,先同步Slave,再相应Producer)
a.集群机构图(两主两从):
b.集群工作流程
c.集群管理工具:mqadmin
七、RocketMQ角色介绍
- producer:消息发送者;
- consumer:消息接受者;
- broker:暂存和传输消息;
- NameServer:管理Broker;
- Topic:区分消息的种类;
- Message Queue:相当于是Topic的分区,用于并行发送和接收消息;