[分布式学习]消息队列之rocketmq笔记
mq有很多,近期买了《分布式消息中间件实践》这本书,学习关于mq的相关知识。mq大致有有4个功能:
- 异步处理。比如业务端需要给用户发送邮件,不需要等发送完了之后才让业务端的调用代码返回。
- 服务解耦。服务之间调用不需要在代码上写死调用某某服务,只需要发送一个消息即可。这种发送消息的处理一般都是立即返回。类似于生成一个后台job。
- 流量削峰。业务系统在做活动的时候短时间内的流量会特别大,基于mq的队列的特性,可以处理这个瞬时流量过大的问题,减轻后端压力。
- 消息通讯。主要是订阅机制,类似聊天室。
内容介绍
低延时的分布式消息处理平台,高性能,可扩展,万亿级。由4个部分构成。name server,broker(消息代理人),producer,consumers。这4个都能水平扩展(做成集群的方式)来避免单点故障。
NameServers (集群)
NameServer是一个完整的功能性服务。主要包含以下两个方面:
- Broker管理。接收Broker集群过来的注册消息,然后提供心跳包机制来检查Broker是否还存活。
- 路由管理。每一个NameServer都包含关于Broker的完整路由信息,并且队列化处理客户端的查询请求。
有4种方式用于客户端指定NameServer的地址。
- 编程方式。类似
producer.setNamesrvAddr("ip:port")
- Java 配置。使用
rocketmq.namesrv.addr
- 环境变量。使用
NAMESRV_ADDR
- http 端点。
提供轻量的服务发现与路由,每一个Name Server记录完整的路由信息,提供相应的读写服务,同时支持快速存储扩展。
Broker (集群)
Broker负责消息的存储和分发,消息查询,高可用保证等。模块如下图所示。
所以,他有以下几个比较重要的子模块:
- 远程模块。Broker的入口,用于接收客户端过来的请求。
- 客户端管理。用于(生产者/消费者)模式的客户端管理,维护消费者对主题的订阅。
- 存储服务。提供一些简单的api用于查询or存储物理磁盘上的消息。
- 高可用保证服务。提供主从Broker之间的数据同步特性。
- 索引服务。通过特定的key对消息构建索引,然后提供消息查询。
通过提供轻量级的主题队列机制来负责消息的储存。支持推拉模式,包含错误容忍机制(2或3份拷贝)。消息的顺序处理。提供容灾回复,预警机制等。
Producer (集群)
生产者提供分布式部署。分布式的生产者通过负载均衡的方式发送消息给Broker。支持快速错误反馈,并且低延迟。
Consumer (集群)
消费者也支持在推/拉模式中的分布式部署。支持集群消费+消息广播。提供实时的消息订阅机制以满足大部分需求。
如何运行(单机测试环境)
下载
安装包就好(源码也行),然后解压
wget http://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.5.1/rocketmq-all-4.5.1-bin-release.zip
unzip rocketmq-all-4.5.1-bin-release.zip -d /usr/lib/rocketmq/
改一些配置
环境变量
#配置64位jdk是必须的---这里跳过
export ROCKETMQ_HOME=/usr/lib/rocketmq/rocketmq #这个不是必须,只是方便下面操作
source ~/.bash_profile #使配置生效一下
rm -f ~/logs/rocketmqlogs/*.log # 把日志清了,方便查看
启动参数
rocketmq默认的内存配置要求对我们的测试服务器要求太高了,改低一点。
vim $ROCKETMQ_HOME/bin/runserver.sh
# 把第39行改成
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g" #最小,启动,最大都是1g
vim $ROCKETMQ_HOME/bin/runbroker.sh
# 把39行改成
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g" # 同上面
broker配置
vim $ROCKETMQ_HOME/conf/broker.conf
# 加这些配置
brokerIP1 = 192.168.3.20 #此broker的ip
namesvrAddr=192.168.3.20:9876 #nameServer地址,集群的话需要分号分隔。
启动NameServer
因为需要NameServer来管理Broker,所以先启动NameServer。默认的日志地址为~/logs/rocketmqlogs
。
nohup sh $ROCKETMQ_HOME/bin/mqnamesrv & # 以忽略挂起信号的方式启动nameserver
tail -f ~/logs/rocketmqlogs/namesrv.log # 监控的方式查看日志尾部
启动Broker
消息要通过Broker来分发,NameServer也已经启动,所以现在可以启动Broker。
nohup sh $ROCKETMQ_HOME/bin/mqbroker -c $ROCKETMQ_HOME/conf/broker.conf &
tail -f ~/logs/rocketmqlogs/broker.log
web站点查看
这里需要去下载这个,里面有个rocketmq-console。需要修改一个地方。rocketmq-externals/rocketmq-console/src/main/resources/application.properties
,
rocketmq.config.namesrvAddr=192.168.3.20:9876 #改成对应的namesrvAddr 地址
服务器上需要开放几个端口用于console的连接,如果没有配置,就是默认的:9876,10911,10909
firewall-cmd --zone=public --add-port=9876/tcp --permanent
firewall-cmd --reload
然后就能查看了。
发送、接收消息
后续通过代码客户端的方式来实践。
关闭服务
sh $ROCKETMQ_HOME/bin/mqshutdown broker #先关了Broker
sh $ROCKETMQ_HOME/bin/mqshutdown namesrv #再关闭nameserver