ActiveMQ学习笔记(一)MQ初步了解/ActiveMQ的安装
MQ解决的场景
MQ = 消息队列
技术维度:
- API发送和接收
- MQ的高可用性
- MQ的集群和容错配置
- MQ的持久化
- 延时发送/定时投递
- 签收机制
- Spring整合
……
系统之间直接调用实际工程落地和存在的问题?
微服务架构后,链式调用是写程序的一般流程,一个整体功能会被拆分成多个子模块。
例如:A调用B,B调用C,C调用D。大型分布式应用中,系统间的RPC交互比较复杂,一个功能可能需要调用上百个接口。其中一个模块出现问题,之后的模块都需要等待,性能大大降低
- 系统之间接口耦合比较严重 : 新增一个下游功能,都要对上游的相关接口进行改造
例如
A发送给B和C的数据有差异,因此A要对发送给每个系统的数据分别进行组装,逐一发送
如果接入了新的系统D,就需要修改A系统,让它感知到D的存在,再把组装好的数据发送给D - 面对大流量并发,容易被冲垮
秒杀业务:
上游系统发起下单购买操作
下游系统需要完成业务逻辑:(读取订单,库存检查,库存冻结,余额检查,余额冻结,订单生成,余额扣减,库存扣减,生成流水,余额解冻,库存解冻)
业务系统难以处理大流量的下单请求 - 等待同步性能较低
RPC接口基本上是同步调用,整体的服务性能遵循“木桶理论”,整体系统的耗时取决于链路中最慢的那个接口
针对上述问题,设计系统需要达到的目标:
1.系统解耦,新的模块进来时,可以做到代码改动最小:解耦
2.设置流量缓冲池,可以让后端系统按照自身吞吐能力进行消费:削峰
3.强弱依赖梳理能将非关机调用链路的操作异步化并提升整体系统的吞吐能力:异步
为什么要使用MQ?
解决了耦合调用、流量削峰(保护主业务)、异步模型
大致流程:
发送者把消息发送给消息服务器,消息服务器将消息存放在若干队列中,合适的时候,消息服务器会将消息转发给接收者。
发送和接受是异步的,而且发送者和接收者的生命周期也没有必然关系。
发送者和接收者不必了解对方,只需要接收消息。发送者和接收者不必同时在线。
在发布pub/订阅sub 模式下,可以完成一对多的通信,让一个消息有多个接收者
linux环境下部署:
在linux 的opt 目录下上传 mq 的压缩包,(使用vmware-tools 上传的)
进行解压缩
将解压缩后的文件夹放到 /myactivemq 下
启动:
直接进入myactivemq 的 文件下的activemq 下的 bin 目录,使用 ./activemq start 命令启动
检查activemq 是否启动的三种方法: 也是三种查看后台进程的方法
ps ‐ef|grep activemq|grep ‐v grep // grep ‐v grep 可以不让显示grep 本来的信息
netstat ‐anp|grep 61616 // activemq 的默认后台端口是61616 45 lsof ‐i:61616 如果端口被占用,证明服务开启了
让启动的日志信息不在控制台打印,而放到专门的文件中:
./activemq start > /myactivemq/myrunmq.log
ActiveMQ控制台
1.关闭win和linux的防火墙
2.win ping通linux ,linux ping通win
部署在linux 上的acvtiveMQ 要可以通过前台windows 的页面访问,必 须把linux 的IP和 windows的 IP 地址配置到同一个网关下 。这种情况一般都是 修改 linux 的IP 地址,修改网卡文件对应的IP 地址
cd /etc/sysconfig/network‐scripts
vi ifcfg‐eth0
找到#GATEWAY 进行修改
访问:
使用 ip +端口号进行访问 第一次访问账号密码默认都是admin,出现下列界面就成功了!
访问不到:
1 可能是你的linux 和 windows 没有在一个网关下
2 可能你windows 的防火墙或者 linux 的防火墙没有关掉(是的,先得关掉防火墙)
3 你忘记启动activemq 的服务了
4 你启动失败了,可能是你得java 环境没配好,必须是 jdk 8 或者以上
Windows环境下部署:
1.下载 http://activemq.apache.org/download.html 选择windows版本
2.将压缩包解压缩到指定目录
3.双击开启
JMS :
Java 消息中间件的服务接口规范,activemq 之上是 mq , 而 mq 之上是JMS 定义的消息规范 。 activemq 是mq 技术的一种理论实现(与之相类似的实现还有 Kafka RabbitMQ RockitMQ ),而 JMS 是更上一级的规范。
采用61616端口提供JMS服务,是给java用的tcp端口
采用8161端口提供管理控制台服务