近期计划学习一下消息队列;
找到的学习视频地址:尚硅谷ActiveMQ教程快速入门
1.基础概念
- 消息, 也就是具有发送方和接收方的一个通信方式.
- 消息中间件:消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。
- 本次学习的
ActiveMQ
具有MQ的高可用性
,支持api发送和接收
,集群和容错配置
,持久化
,延时发送以及定时投递消息
,签收机制
;且可以整合到spring
中.
MQ为什么要出现
直接画图,模拟一个设想的MQ效果,
使用MQ之后,很好地解决了耦合调用问题
;
同时这个中间人也阻挡了一大部分的流量袭击;抵挡洪峰流量,削峰,保护了主要的业务
;
那么这个操作就可以专心于自己的事情;
原本需要等待的B,C,D,....
等人,给中间人说明情况后,可以去做自己的事情了,不需要在这里一直等待;也就是一种异步通知操作
吧.
系统直接调用会出现的一些问题
微服务架构后,常用的这个链式调用
;比如模块 A 调用模块 B,模块 B 调用模块 C,模块 C 调用模块 D。但在大型分布式应用中,系统间的 RPC 交互繁杂,一个功能背后要调用上百个接口并非不可能,从单机架构过渡到分布式微服务架构的通例.
那么系统直接调用会出现的一些问题:
(1)系统直接的接口相互调用,就会出现耦合度过高
的问题,系统模块之间的依赖关系过于密切.
- 比如说,系统A本来和
支付系统B
,物流系统C
组成了一个完整的系统,之间数据传输也比较完善;- 但是后来又出于新的业务考虑,新增了一个
安全系统D
,那么D系统也需要A的数据,就要去改动系统A;- 在这样的架构中,每次出现/减少一个下级系统,都需要对上级系统进行改动.
(2)无法抵御大量的并发流量来袭
;
在系统中每个接口模块的吞吐能力是有限的,当大流量来袭容易被击穿。
比如说这样一个下单的操作:看似简单的一个操作,在底层实际要完成多步操作,
若此时出现大量的高并发流量来袭,那么这些底层的操作能否保证一定不会出现问题呢???
(3)大量同步等待时,就会出现阻塞性能消耗问题
在同步调用的情境下,整体的服务性能遵循“木桶理论”,即整体系统的耗时取决于链路中最慢的那个接口。
比如A调用下面3个子系统都用时平均5秒,但是B系统又需要调用自己的子系统E20秒,
那么以A为中心的这个系统就得耗时25秒
需要对于系统直接调用的问题,就得考虑解耦,削峰,异步
;
- 解耦:解决系统之间紧密的耦合调用;
- 削峰:可以设置一个流量缓冲池,让后端系统按自己的吞吐量进行配置;
- 异步,避免了调用者的长时间等待问题.
介绍MQ
MQ实际就是面向消息的中间件MOM
(message-oriented middleware)
- 可使用高效安全的
消息传输机制
,与平台无紧要关联的数据交流,基于数据通信集成分布式系统; - 通过
消息传递
和消息排队模型
在分布式的环境下进行应用解耦; - 可以做到
数据的冗余处理
,异步消息通信
,高流量削峰
,适应性解耦
,弹性伸缩
;
当一个
消息
发到消息服务器
之后, 这个消息服务器
会将该消息存入到消息队列
中;在接受者
不忙的时候,将该消息发给接受者
; 这整个处理的过程中,都是得要异步通信的,避免了过多的等待而产生效率问题; 这个也可以完成一对多的通信
,一个消息可以发给多个接收者去处理.
MQ的特点之处
消息发送者可以发送一个消息而无须等待响应
。消息接收者
可订阅/监听
这个通道。消息可以转发给一个或者多个消息接收者
,整个过程都是异步的。发送者和接收者
不需要过多地了解对方的信息, 而且发送者和接收者
也不需要同时都必须在线;
比如说这样模拟一个订单系统
MQ固然有利,当然也有弊==>两个系统不能同步调用
,不能实时回复
,不能响应某个调用的回复
。
2.下载安装使用ActiveMQ
在http://activemq.apache.org/
进行下载;
由于我常用Java8版本,也就下了这个版本的linux版;
解压安装
下载之后, 使用ftp文件传输工具,将jar包传送到服务器;
使用命令进行解压;
tar -zxvf apache-activemq-5.16.4-bin.tar.gz
将该文件拷贝到根目录下的
myactiveMQ
文件夹中;
cp -r apache-activemq-5.16.4 /myactiveMQ/
cd /myactiveMQ/apache-activemq-5.16.4
基本启动命令
./activemq start
注意这个使用MQ需要java环境;
我这里之前已经安装过了Java的jdk环境;
可用java -version
查看使用的版本.
查看进程的三种方式
activemq的默认端口为61616
(1)查看进程的方式一:
可使用该命令查看
activemq
的进程;
ps -ef|grep activemq
当然,在查看进程时,可使用命令隐藏一些不需要看到的信息
ps -ef|grep activemq|grep -v grep
(2)查看进程的方式二:
可查看和这个61616的端口是否被占用了,类似于一种kv键值对的格式;
若该端口在使用,则将会查到对应的进程号
netstat -anp|grep 61616
(3)查看进程的方式三:
使用命令,也可以精确查询到指定端口的启用进程情况;
lsof -i:61616
基本关闭命令
关闭activemq使用的命令;
./activemq stop
自定义日志文件启动
带有日志的启动方式;
即在这里运行同级目录下,生成一个日志文件,便于查看运行中的问题;
使用命令;
./activemq start > /myactiveMQ/myrunmq.log
此时已经启动,但是没有打印之前的那种启动信息;
因为它已经把生成的运行信息打印到了日志文件中;
可使用编辑命令查看日志
vi /myactiveMQ/myrunmq.log
ActiveMQ 控制台
现在虽然可以用命令启动ActiveMQ,可是前台看不到效果;
比如之前学习的tomcat服务器,我们就可以运行,在网页看到效果;
注意 在前台访问时,端口号为
8161
默认的用户名和密码为admin
admin
那么现在模拟使用, 将windows作为显示使用的客户端; Linux下的activeMQ作为服务器;
- 先用命令查看自己的linuxIP地址;
我的linuxip为:192.168.59.128
ifconfig
- 查看自己的windowsip;
在本地cmd命令窗口输入ipconfig
查看自己的ip
我这里是192.168.116.1
- 那么要做到两个操作系统之间可以交互,首先要ping通ip;
这里先关掉linux的防火墙;
输入命令
service iptables stop
或centOS7版本使用;
systemctl stop firewalld
- 在windows和linux进行 ping通对方的ip;
在Linux去pingwindows的Ip
windows中pingLinux的IP
麻了,我这里一直访问不上去;
只能查看防火墙是否开放了8161这个端口
firewall-cmd --query-port=8161/tcp
开放端口
firewall-cmd --zone=public --add-port=8161/tcp --permanent
重启防火墙
firewall-cmd --reload
访问还是不行,
在activemq安装的文件目录conf中改变jetty.xml文件中的host值; 127.0.0.1 改为0.0.0.0
终于访问到了http://192.168.59.128:8161/admin/