六 Rocketmq–消息驱动
MO(Message Queue)是一种跨进程的通信机制,用于传递消息。通俗点说,就是一个先进先出的数据结构(管道)。
功能:
- 异步解耦 :异步解耦是消息队列MQ的主要特点,主要目的是减少请求响应时间和解耦。主要的使用场景就是将比较耗时而且不需要即时(同步) 返回结果的操作作为消息放入消息队列。同时,由于使用了消息队列MQ,只要保证消息格式不变,消息的发送方和接收方并不需要彼此联系,也不需要受对方的影响,即解耦合。
- 流量削峰 :流量削峰也是消息队列MQ的常用场景,一般在秒杀或团队抢购(高并发) 活动中使用广泛。秒杀处理流程如下所述:
- 1.用户发起海量秒杀请求到秒杀业务处理系统。
- 2.秒杀处理系统按照秒杀处理逻辑将满足秒杀条件的请求发送至消息队列 MQ。
- 3.下游的通知系统订阅消息队列MQ的秒杀相关消息,再将秒杀成功的消息发送到相应用户。
- 4.用户收到秒杀成功的通知。
目前业界有很多MQ产品,比较出名的有下面这些:
- ZeroMQ : 号称最快的消息队列系统,尤其针对大吞吐量的需求场景。扩展性好,开发比较灵活,采用C语言实现,实际上只是一个socket库的重新封装,如果做为消息队列使用,需要开发大星的代码。ZeroMQ仅提供非持久性的队列,也就是说如果down机,数据将会丢失。
- RabbitMQ : 使用erlang语言开发,性能较好,适合于企业级的开发。但是不利于做二次开发和维护。
- ActiveMQ : 历史悠久的Apache开源项目。已经在很多产品中得到应用,实现了JMS1.1规范,可以和spring-jms轻松融合,实现了多种协议,支持持久化到数据库,对队列数较多的情况支持不好。
- RocketMQ : 阿里巴巴的MQ中间件,由java语言开发,性能非常好,能够撑住双十一的大流量,而且使用起来很简单。
- Kafka : Kafka是Apache下的一个子项目,是一个高性能跨语言分布式Publish/Subscribe消息队列系统相对于ActiveMQ是一个非常轻量级的消息系统,除了性能非常好之外,还是一个工作良好的分布式系统。
环境准备
-
1.下载RocketMQ
http://rocketmq.apache.org/release_notes/release-notes-4.4.0/(看图片) -
2.环境要求
- Linux 64位操作系统
- 64bit JDK 1.8+ # jdk-8u333-linux-x64.tar.gz
-
3.安装RocketMQ
- 上传文件到Linux系统
[root@heima rocketmq]# ls /usr/local/src/ rocketmq-all-4.4.0-bin-release.zip - 解压到安装目录
[root@heima src]# unzip rocketmq-all-4.4.0-bin-release.zip
[root@heima src]# mv rocketmq-all-4.4.0-bin-release …/rocketmq
- 上传文件到Linux系统
-
4.启动RocketMQ
- 切换到安装目录里的bin目录
[root@heima bin]# cd /usr/local/rocketmq/bin - 启动NameServer
[root@heima bin]# nohup ./mqnamesrv & # 只要进程不报错,就应该是启动成功了,可以查看一下日志
[root@heima bin]# tail -f /root/logs/rocketmqlogs/namesrv.log - 启动Broker
// 编辑runbroker.sh 和 runserver.sh文件,修改里面的
// JAVA_OPT=“JAVAOPT−server−Xms8g−Xmx8g−Xmn4g"//为JAVAOPT="{JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g" // 为JAVA_OPT="JAVAOPT−server−Xms8g−Xmx8g−Xmn4g"//为JAVAOPT="{JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m”
[root@heima bin]# nohup ./mqbroker -n localhost:9876 &
// 后期用这个启动nohup sh ./mqbroker -n localhost:9876 -c …/conf/broker.conf &
[root@heima bin]# tail -f /root/logs/rocketmqlogs/broker.log
- 切换到安装目录里的bin目录
-
5.测试RocketMQ
- 测试消息发送
[root@heima bin]# export NAMESRV_ADDR=localhost:9876
[root@heima bin]# ./tools.sh org.apache.rocketmq.example.quickstart.Producer - 测试消息接收
[root@heima bin]# export NAMESRV_ADDR=localhost:9876
[root@heima bin]# ./tools.sh org.apache.rocketmq.example.quickstart.Consumer - 关闭RocketMQ
[root@heima bin]# ./mqshutdown broker
[root@heima bin]# ./mqshutdown namesrv
- 测试消息发送
扩展知识-Linux安装JDK
1.根据Linux系统的位数选择要下载的压缩包。怎么知道Linux系统的位数呢?可以执行下面的命令:
getconf LONG_BIT
2.如果显示32,则是23位的Linux系统,如果显示64,则是64位的Linux系统。这里是64位的,所以下载Linux x64,
假如你没有登录过Oracle的账号,会跳转到Oracle账号登录页面。想下载JDK,必须有Oracle账号,这一点比较恶心。如果你还没有注册过,我已经为你准备好账号(此账号仅供下载JDK使用):
用户名:OneMoreStudy@163.com
密码:One-More-Study-666
输入用户名和密码,登录以后就可以直接下载了。
3.安装
把下载好的压缩包,上传到Linux系统中。
3.1 创建安装目录
mkdir /usr/local/java/
3.2 解压缩到安装目录
tar -zxvf jdk-8u333-linux-x64.tar.gz -C /usr/local/java/
解压缩以后,进入/usr/local/java/目录后,你会发现多一个目录,它就是JDK所在目录。JDK版本不同,这个目录名有所不同,这里是jdk1.8.0_241,那么完整路径就是 /usr/local/java/jdk1.8.0_241,记住这个路径,下面会用到。
3.2 设置环境变量
执行以下命令,编辑 /etc/bashrc文件:
vi /etc/bashrc
3.3当我们进入vim编辑器后,默认为普通模式,这时候,如果你想输入些字符的话,需要先进去插入模式才行。进入插入模式可直接按下下面的字母,他们的意义有所不同:
a在光标后插入
A在当前行最后插入
在文件的末尾添加如下内容:
export JAVA_HOME=/usr/local/java/jdk1.8.0_333
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
保存退出 :wq
3.4执行以下命令,使刚刚设置的环境变量生效:
source /etc/bashrc
3.5验证
执行Java的打印版本命令:
java -version
如果显示下面的Java版本信息,恭喜你,你已经安装成功了。
java version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.241-b11, mixed mode)
------------------------------------------------
RocketMQ的架构及概念
RocketMQ架构,实现功能—整体可以分成4个角色,分别是:NameServer,Broker,Producer,Consumer。
- Broker(邮递员)
Broker是RocketMQ的核心,负责消息的接收,存储,投递等功能 - NameServer(邮局)
消息队列的协调者,管理Broker,Broker向它注册路由信息,同时Producer和Consumer向其获取路由信息 - Producer(寄件人)
消息的生产者,需要从NameServer获取Broker信息,然后与Broker建立连接,向Broker发送消息 - Consumer(收件人)
消息的消费者,需要从NameServer获取Broker信息,然后与Broker建立连接,从Broker获取消息Topic(地区)用来区分不同类型的消息,发送和接收消息前都需要先创建Topic,针对Topic来发送和接收消息 - Message Queue(邮件)
为了提高性能和吞吐量,引入了Message Queue,一个Topic可以设置一个或多个MessageQueue,这样消息就可以并行往各个Message Queue发送消息,消费者也可以并行的从多个MessageQueue读取消息 - Message
Message是消息的载体。 - Producer Group
生产者组,简单来说就是多个发送同一类消息的生产者称之为一个生产者组。 - Consumer Group
消费者组,消费同一类消息的多个 consumer 实例组成一个消费者组。
RocketMQ控制台安装
- 1 下载
在git上下载下面的工程 rocketmq-console-1.0.0
https://github.com/apache/rocketmq-externals/releases
解压文件,只需要 rocketmq-console文件夹,实际上是一个maven工程 - 2 修改配置文件
rocketmq-console\src\main\resources下的配置文件
[server.port=7777] #项目启动后的端口号
[rocketmq.config.namesrvAddr=43.143.153.172:9876] #nameserv的地址,注意防火墙要开启 9876端口,用ip addr show 查看Linux的IP4端口
[rocketmq-console\src\main\resources\application.properties] #nameserv的地址,注意防火墙要开启 9876端口 - 3 打成jar包,并启动
在rocketmq-consol