RocketMQ


RocketMQ

一、什么是MQ?

  • MQ:MessageQuery,消息队列。队列,是一种FIFO先进先出的数据结构。消息由生产者发送到MQ进行排队,然后按原来的顺序交由消息的消费者进行处理。QQ,微信就是典型的MQ。

二、引入MQ的优点

  • 异步:异步能提高系统的相应速度,吞吐量。
  • 解耦:服务之间进行解耦,才可以减少服务之间的影响。提高系统整体的稳定性一阶可扩展性
  • 削峰:以稳定的系统资源对突发的流量的冲击。

三、引入MQ的缺点

  • 系统可用性降低:系统引入外部依赖增多,系统的稳定性就会变差。一旦MQ宕机,就会对业务产生影响。这就需要考虑如何保证MQ的高可用性。
  • 系统的复杂度提高:引入MQ后系统的复杂度会大大提高。以前服务之间可以进行同步的服务调用,引入MQ后,会变为异步调用,数据的链路就会变得更加复杂。并且还会带来其他的一些问题。比如:如何保证消费不会丢失?不会被重复调用?怎么保证消息的顺序行等问题。
  • 消息一致性问题:A系统处理完业务,通过MQ发送消息给B,C系统进行后续的业务处理。如果B系统处理成功,C系统处理失败怎么办?这就需要考虑如何保证消息数据处理的一致性(分布式事务)。

四、几大MQ产品特点比较

1645453368193

五、安装环境

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.集群机构图(两主两从):

1645624596233

b.集群工作流程

1645624693294

c.集群管理工具:mqadmin

七、RocketMQ角色介绍

  • producer:消息发送者;
  • consumer:消息接受者;
  • broker:暂存和传输消息;
  • NameServer:管理Broker;
  • Topic:区分消息的种类;
  • Message Queue:相当于是Topic的分区,用于并行发送和接收消息;

文章作者: Anubis
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Anubis !
评论
  目录