RocketMQ原理解析之服务安装启动
一、RocketMQ简介
阿里的消息中间件有很长的历史,从2007 年的Notify 到2010 年的Napoli,2011 年升级后改为MetaQ ,然后到2012 年开始做RocketMQ, RocketMQ 使用Java 语言开发,于2016 年开源。第一代的Notify 主要使用了推模型(push),解决了事务消息;第二代的MetaQ 主要使用了拉模型(pull),解决了顺序消息和海量堆积的问题。RocketMQ 基于长轮询的拉取方式, 兼有两者的优点。
消息队列是基于“先进先出(FIFO)” 的一种数据结构, 随着互联网的发展,“微架构” 的模式不段兴起, 这些微服务可以再同一个局域网内,也可以跨机房部署,这使得服务之间松耦合要求越来越高, 并且服务之间的联系越来越紧密。这对通信质量要求越来越高, 对消息队列也有了更高的要求。
二、消息队列提供的功能
2.1 应用解耦
复杂的应用里会存在多个子系统, 比如:电商系统中有 会员中心、用户中心、交易中心、支付中心、营销中心、库存中心、物流中心、通用中心等。传统的开发是前面的各个中心放在一个应用中, 这使得各个子系统之间的耦合性太高了,整个系统的可用性比较低, 即使各个子模块是低错误率系统,但是整合到一起可能会是一个高错误率的系统。
举例: 以电商系统为例,用户在创建订单后,如果耦合调用库存系统,物流系统,支付系统,当其中一个子系统出现问题或者进行升级,都会造成整个下单流程失败, 严重影响用户的体验。
如果系统之间的调用通过消息队列,系统的可用性会提高很多, 还是参照上面的例子, 如果物流系统出现BUG或者在进行升级, 可以将消息缓存在消息队列中, 在服务可以正常使用时再进行后续处理,保证这个服务再宏观上时可用的,终端客户也不会感受到故障的发生。
可以参照下面的图进行比较:
2.2 流量削峰
在高并发的场景下,大部分应用系统的流量会达到峰值,如果没有缓存机制,不可能承受住短时间内大流量冲击,如果利用消息队列,将消息请求暂存起来,分散到较长的时间来处理,能很大程度提高系统稳定性和用户体验。
比如: 订单系统处理能力是5000次/s,如果在秒杀、其它高并发场景, 当请求处理超过5000, 只能拒绝之后的请求,如果将请求暂存在消息队列中,分散在较长的一段时间来处理,比如十几秒之后客户收到订单成功消息,这个是可以接受的,相较与下单失败,有很高的用户体验。
2.3 消息并发
在整个应用系统中,数据是不断产生的,数据产生方只需要将各自的数据协议消息队列,数据使用方只需要订阅自己感兴趣的消息即可,不同模块之间互不干扰, 不需要和数据产生方有关联。
可以通过下面的图示进行理解:
除了上面提到的功能, RocketMQ还具有 最终一致性、方便动态扩容 功能,后期再进行补充。
三、RocketMQ服务安装
3.1 单机版RockMQ安装
RocketMQ安装存在两种方式(本文只介绍第一种)
- Binary版, 一些编译好的jar和辅助shell脚本
- Source版, RocketMQ源码, 需要自己通过maven编译
下图是官网(http://rocketmq.apache.org/dowloading/releases/)给的下载文件
- 推荐系统: 64bit OS, Linux/Unix/Mac
- JDK: 64bit JDK 1.8+
- Maven 3.2.x
- Git
注: 其中maven 、git是针对源码安装的
3.1.1 下载文件
> wget -c http://mirror.bit.edu.cn/apache/rocketmq/4.2.0/rocketmq-all-4.2.0-bin-release.zip
3.1.2 解压文件
> unzip rocketmq-all-4.2.0-bin-release.zip -d ./rocketmq-all-4.2.0-bin
> cd rocketmq-all-4.2.0-bin
RocketMQ的目录结构如下(下面是Win10中的视图, 不是Linux中的视图, 但是文件的内容一样):
- benchmark 里包括运行benchmark 程序的shell 脚本
- bin , 文件夹中包含RocketMQ使用的各种shell脚本(Linux平台) 和 cmd脚本(win平台), 比如: mqnamesrv(启动nameserver), mqbroker(启动Broker)
- conf, 里面有一些示例配置文件, 参考下面图示
- lib 文件夹里包括RocketMQ各个模块编译成的jar 包,以及RocketMQ 依赖的一些jar 包,比如Netty 、commons - lang 、FastJSON 等
- LICENSE 、NOTICE 和README.md 包括一些版权声明和功能说明信息
3.1.3 启动消息队列服务
- 启动NameServer
> nohup sh bin/mqnamesrv &
- 启动broker
> nohup sh bin/mqbroker -n localhost:9876 &
3.1.4 命令行发送接收消息
- 启动生产者
> export NAMESRV ADDR=localhost:9876
> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
输出内容:
SendResult [sendStatus=SEND OK, msgid=
- 启动消费者
>sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
输出内容:
ConsumeMessageThread_%d Receive New Messages: [MessageExt . …
3.1.5 关闭消息队列
消息队列被启动后, 如果不主动关闭,会一直在后台运行,占用系统资源。
- 关闭broker
> sh bin/mqshutdown broker
- 关闭namesrv
> sh bin/mqshutdown namesrv
经过上面的操作流程, 一个简单的RocketMQ已经安装好了。
3.2 多机集群配置和部署
本节介绍如何搭建三主、三从、无单点故障的高可用RocketMQ集群,假设这里有3台物理机,IP分别是192.168.1.19,192.168.1.20,192.168.1.21
注:这里每台物理机上会有一主,一从RocketMQ Broker服务器,如果主从不放在一台物理机上,可以分开部署, 操作和下面区别不大。