AtiveMQ
一、入门概述
1、前言
MQ == 消息中间件,消息、中间件
消息:
以一种双方约定好的格式作为一种信息的载体的传输媒介在网络上发布,然后获得信息的同步和资源的交换
中间件:三个三角形,zookeeper、eureka、MQ的这种模式
2、MQ的产品种类和对比
MQ就是消息中间件。MQ是一种理念,ActiveMQ是MQ的落地产品。
不管是哪款消息中间件,都有如下一些技术维度
:
掌握和了解了技术维度后去学习另外的MQ落地实现框架的方式方法是一样的
(1) kafka
编程语言:scala。
大数据领域的主流MQ。
(2) rabbitmq
编程语言:erlang
基于erlang语言,不好修改底层,不要查找问题的原因,不建议选用。
(3) rocketmq
编程语言:java
适用于大型项目。适用于集群。
(4) activemq
编程语言:java
适用于中小型项目。
3、MQ的产生背景
系统之间直接调用存在的问题?
链式调用
是我们在写程序时候的一般流程,系统间的RPC交互繁杂,一个功能背后要调用上百个接口并非不可能,从单机架构过渡到分布式微服务架构的通例。这些架构会有哪些问题?
(1) 系统之间接口耦合比较严重
每一个问问题的同学都有自己相对于的说辞,老师就需要根据不同来判断
每新增一个下游功能,都要对上游的相关接口进行改造;
举个例子:如果系统A要发送数据给系统B和系统C,发送给每个系统的数据可能有差异,因此系统A对要发送给每个系统的数据进行了组装,然后逐一发送;
当代码上线后又新增了一个需求:把数据也发送给D,新上了一个D系统也要接受A系统的数据,此时就需要修改A系统,让他感知到D系统的存在,同时把数据处理好再给D。在这个过程你会看到,每接入一个下游系统,都要对系统A进行代码改造,开发联调的效率很低。其整体架构如下图:
(2) 面对大流量并发时,容易被冲垮
每一个问问题的同学,都直接问老师,老师一个人承受所有同学要问问题的压力
每个接口模块的吞吐能力是有限的,这个上限能力如果是堤坝,当大流量(洪水)来临时,容易被冲垮。
举个例子秒杀业务:上游系统发起下单购买操作,就是下单一个操作,很快就完成。然而,下游系统要完成秒杀业务后面的所有逻辑(读取订单,库存检查,库存冻结,余额检查,余额冻结,订单生产,余额扣减,库存减少,生成流水,余额解冻,库存解冻)。
(3) 等待同步存在性能问题
一个同学问问题老师需要现在即可马上回答他,老师不能马上回答他,所有导致后面的同学要都等待回答完,一个一个轮
RPC接口上基本都是同步调用,整体的服务性能遵循“木桶理论”,即整体系统的耗时取决于链路中最慢的那个接口。比如A调用B/C/D都是50ms,但此时B又调用了B1,花费2000ms,那么直接就拖累了整个服务性能。
根据上述的几个问题,在设计系统时可以明确要达到的目标:
1,要做到系统解耦,当新的模块接进来时,可以做到代码改动最小;能够解耦
2,设置流量缓冲池,可以让后端系统按照自身吞吐能力进行消费,不被冲垮;能削峰
3,强弱依赖梳理能将非关键调用链路的操作异步化并提升整体系统的吞吐能力;能够异步
4、MQ的主要作用
MQ如同一个班长,设定了同学的问题以提供一张约定好的格式的单子给班长,然后就可以回家去等老师了,班长装到盒子里,老师从盒子中获取单子,来进行接下来的操作
(1) 异步
。调用者无需等待。
老师早上拿到单子,他可以下午回复联系学生
(2) 解耦
。解决了系统之间耦合调用的问题。
让学生以约定好的方式,来提交单子,不需要让每个学生有自己专门的说辞
(3) 消峰
。抵御洪峰流量,保护了主业务。
将流量分流给了班长,老师就不需要收到这么大的询问压力
5、MQ的定义
面向消息的中间件(message-oriented middleware)MOM
能够很好的解决以上问题
是指利用高效可靠的消息传递机制与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递
和消息排队
模型在分布式环境下提供应用解耦,弹性伸缩,冗余存储、流量削峰,异步通信,数据同步等功能。
大致的过程是这样的:
发送者把消息发送给消息服务器,消息服务器将消息存放在若干队列/主题topic中,在合适的时候,消息服务器回将消息转发给接受者。在这个过程中,发送和接收是异步的,也就是发送无需等待,而且发送者和接受者的生命周期也没有必然的关系;尤其在发布pub/订阅sub模式下,也可以完成一对多的通信,即让一个消息有多个接受者。
6、MQ的特点
(1) 采用异步处理模式
消息发送者可以发送一个消息而无须等待响应。消息发送者将消息发送到一条虚拟的通道(主题或者队列)上;
消息接收者则订阅或者监听该爱通道。一条消息可能最终转发给一个或者多个消息接收者,这些消息接收者都无需对消息发送者做出同步回应。整个过程都是异步
的。
案例:
也就是说,一个系统跟另一个系统之间进行通信的时候,假如系统A希望发送一个消息给系统B,让他去处理。但是系统A不关注系统B到底怎么处理或者有没有处理好,所以系统A把消息发送给MQ,然后就不管这条消息的“死活了”,接着系统B从MQ里面消费出来处理即可。至于怎么处理,是否处理完毕,什么时候处理,都是系统B的事儿,与系统A无关。
(2) 应用系统之间解耦合
发送者和接受者不必了解对方,只需要确认消息。
发送者和接受者不必同时在线。
(3) 整体架构
订单系统生成订单1s,存储系统处理要3s,有了MQ就不需要让订单系统等待存储系统存完才空闲,订单系统直接把生成的订单发送给MQ,存储系统从MQ中取就可以,异步操作,同时MQ也减少了存储系统的压力,消峰;并通过MQ设定的各个,让订单系统不用管如果存储系统改变了业务逻辑或增加业务逻辑后的修改,只需要把约定好的代码发送给MQ,让MQ来处理并发送给存储系统,给代码进行解耦
(4) MQ的缺点
无法做到信息之间的获取同步;
两个系统之间不能同步调用
,不能实时回复,不能响应某个调用的回复。
二、 ActiveMQ安装
(1) 官方下载
官网地址: http://activemq.apache.org/
点击下面,开始下载。
(2) 安装步骤
① 创建目录
[root@s1 ~]# cd /usr/local/
[root@s1 local]# mkdir activemq
[root@s1 local]# cd activemq
② 上传安装包
[root@s1 local]# rz
③ 解压
[root@s1 activemq]# tar -xzvf apache-activemq-5.14.3-bin.tar.gz
④ 在/etc/init.d/目录增加增加activemq文件
[root@s1 activemq]# cd /etc/init.d/
[root@s1 init.d]# vi activemq
注意:将下面内容全部复制。 要先安装jdk,在下面配置jdk的安装目录。
#!/bin/sh
#
# /etc/init.d/activemq
# chkconfig: 345 63 37
# description: activemq servlet container.
# processname: activemq 5.14.3
# Source function library.
#. /etc/init.d/functions
# source networking configuration.
#. /etc/sysconfig/network
export JAVA_HOME=/usr/local/jdk1.8.0_131
export CATALINA_HOME=/usr/local/activemq/apache-activemq-5.14.3
case $1 in
start)
sh $CATALINA_HOME/bin/activemq start
;;
stop)
sh $CATALINA_HOME/bin/activemq stop
;;
restart)
sh $CATALINA_HOME/bin/activemq stop
sleep 1
sh $CATALINA_HOME/bin/activemq start
;;
esac
exit 0
设置权限
chmod 777 activemq
⑤ 设置开机启动
chkconfig activemq on
⑥ 启动ActiveMQ
service activemq start
⑦ 访问activemq管理页面地址:http://IP地址:8161/
账户admin 密码admin
⑧ 查看activemq状态
service activemq status
关闭activemq服务
service activemq stop
重启服务
service activemq restart
(3) 因为主机名不符合规范导致无法启动activemq
https://blog.csdn.net/qq_39056805/article/details/80749337
(4) 启动时指定日志输出文件(重要)
activemq日志默认的位置是在:%activemq安装目录%/data/activemq.log
这是我启动时指定日志输出文件:
说会让服务启动时的日志不打印在控制台上,打印写入在指定的log文件中
service activemq start > /usr/local/activemq/activemq.log
这是老师启动时指定日志输出文件:
>
和>>
都是输出重定向
,将前面命令执行产生的结果通过>或>>输出到某个文件,>是覆盖,>>是追加
(5) 查看程序启动是否成功的3种方式(通用)
查询activemq是否启动
方式1:查看进程
方式2:查看端口是否被占用
方式3:查看端口是否被占用
指令没有就用
yum install lsof
yum install netstat
感谢尚硅谷!!!