MQ之ActiveMQ

1 入门概述

1.1 为什么要引入MQ?

  • 微服务架构后,链式条用是我们在写程序的时候一般的流程,为了完成一个整体功能会将其拆分成多个函数(或子模块),比如模块A调用模块B,模块B调用模块C,模块C调用模块D。但是在大型分布式应用欧中,系统间的RPC交互繁杂,一个功能背后要调用上百个接口并非不可能,这是从单机架构过渡到分布式微服务架构的通例。
  • 这种架构会有哪些问题?
  • ①系统之间接口耦合比较严重。
    • 每新增一个下游功能,都要对上游的相关接口进行改造。
    • 举个例子:
      • 系统A要发送数据给系统B和系统C,发送给每个系统的数据可能有差异,因此系统A对要发送给每个系统的数据需要进行组装,然后逐一发送。
      • 当代码上线后又新增了一个需求:把数据也发送给D,新上的D系统也有接受A系统的数据。此时就需要修改A系统,让他感知到D的存在,同时把数据处理好,再由A发送给D。
    • 在这个过程中你会看到,每接入一个下游系统,都要对A系统进行代码改造,开发联调的效率很低。其整体架构如下图所示:

  • ②面对大流量并发时,容易被冲垮。
    • 每个接口模块的吞吐能力是有限的,这个上限能力就像堤坝,当大流量(洪水)来临时,很容易被冲垮。
    • 举个例子(秒杀业务):
      • 上游系统发起下单购买操作。
      • 下游系统需要完成秒杀业务逻辑:读取订单、库存检查、库存冻结、余额查询、余额冻结、订单生成、余额扣减、库存扣减、生成流水、余额解冻、库存解冻。    
  • ③等待同步存在性能问题。
    • RPC接口基本上是同步调用,整体的服务性能遵循“木桶理论”,即整体系统的耗时取决于链路中最慢的那个接口。比如A调用B/C/D都是50ms,但是此时B又调用了B1,花费了2000ms,那么直接就拖累了整个服务性能。  

  • 根据上述的问题,在设计系统时可以明确要达到的目标:
  • ①要做到系统解耦,当新的模块进来的时候,可以做到代码改动最小。即能够解耦。
  • ②设置流量缓冲池,可以让后端系统按照自身吞吐能力进行消费,不被冲垮。即能够削峰。
  • ③能将非关键调用链路的操作异步化并提升整体系统的吞吐能力。即能够异步。

1.2 MQ的是什么?

  • 面向消息的中间件(Message-Oriented Middleware)MOM能够很好的解决以上问题。
  • 消息中间件是指利用高效可靠的消息传递机制进行和平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型在分布式环境下提供应用解耦、弹性伸缩、冗余存储、流量削峰、异步通信、数据同步等功能。
  • 大致的过程是这样的:
  • 发送者把消息发送给消息服务器,消息服务器把消息存放在如果队列/主题中,在合适的时候,消息服务器会将消息转发给接受者。在这个过程中,发送和接受是异步的,也就是发送无需等待,而且发送者和接受者的生命周期也没有必然的关系。尤其在发布/订阅模式下,也可以完成一对多的通信,即让一个消息有多个接受者。

1.3 MQ的特点

1.3.1 采用异步处理模式

  • 消息发送者可以发送一个消息而无需等待响应。消息发送者将消息发送到一个虚拟的通道(主题或队列)上;消息接受者则订阅或监听该通道。一条消息可能最终转发给一个或多个消息接受者,这些接受者都无需对消息发送者做出同步回应。整个过程是异步的。
  • 案例:
  • 也就是说,一个系统和另一个系统之间进行通信的时候,假如系统A希望发送一条消息给系统B,让他去处理,但是系统A不关注系统B到底怎么处理或者有没有处理好,所以系统A把消息发送给MQ,然后就不管这条消息的“死活”了,接着系统B就从MQ中消费出来即可。至于怎么处理,是否处理完毕,什么时候处理,都是系统B的事儿,和系统A无关。

  •  这样的一种通信方式,就是所谓的“异步”通信方式对于系统A来首,只要把消息发给MQ。然后系统B就会异步去进行处理了,系统A不需要“同步”的等待系统B处理完。这样的好处是什么?解耦。

1.3.2 应用系统之间解耦合

  • 发送者和接受者不必不了对方,只需要确认消息。
  • 发送者和接受者不必同时在线。

1.4 能干嘛?

  • 解耦。
  • 削峰。
  • 异步。

1.5 去哪下?

扫描二维码关注公众号,回复: 9112396 查看本文章

2 ActiveMQ的安装和控制台

2.1 官网下载

  • 略。

2.2 ActiveMQ在Linux上安装

猜你喜欢

转载自www.cnblogs.com/xuweiweiwoaini/p/12302060.html