首先MQ是什么?

MQ是Message Queue(消息队列)。消息队列是一种应用程序对应用程序之间的通信方法、应用程序通过写和检索入列队的针对应用程序的数据(消息)来进行通信,而不需要专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是在应用程序通过队列来通信,队列的使用除去了接收和发送应用程序同时执行的要求。

消息中间件的概况:消息队列技术是分布式应用间交换信息的一种技术,消息队列可驻留在内存或者磁盘上,队列存储消息直到它们被应用程序读走为止,应用程序可独立的执行,它们不需要直到彼此的位置。或者继续执行前不需要等待接收程序接收到的消息。

MQ相关的概念:

(1)消息(Message):消息是MQ中最小的概念,本质上是一段数据,它能被一个或多个应用程序理解,是应用程序之间传递的消息载体。

(2)队列(Queue)

  a、本地队列:本地队列按照功能划分为初始化队列、传输队列、死信队列

  初始化队列:用作消息触发的功能

  传输队列:只是暂存待传的消息,条件许可的情况下,通过管道将消息传递达到其他的队列管理器。

  目标队列:是消息的目的地,可以长期存放消息

  死信队列:当消息不能送到目标队列,也不再路由出去。则自动放入死信队列保存。

b、别名队列和远程队列

  只是一个队列的定义,用来指定远程队里管理器的队列、使用了远程队列,程序就不需要知道目标队列的位置。

c、模型队列:模型队列定义了一套本地队列的属性结合,一旦打开模型队列,队列管理器会按照这些属性动态的创建出一个本地队列。

(3)队列管理器(Queue Manager) 

队列管理器是一个负责向应用程序提供消息服务的机构,如果把队列管理器比作数据库,那么队列就是其中的一张表。

(4)通道(channel)

通道是两个管理器之间的一种单向点对点的通信连接,若需要双向交流,可建立一对通信。

(5)监听器(listener)

MQ产品特性

可靠性传输:这个特点是消息中间件的立足之本,对应用来说,只要成功把数据提交给消息中间件,那么关于数据可靠传输的问题就由消息中间件来负责。

不重复传输:不重复传输也就是断点续的功能,特别适合在网络不稳定的环境,节约网络资源。

异步传输:发送和接收消息的双方不必同时在线,具有脱机能力和安全性。

消息驱动:接到消息后主动通知消息接收方。

支持事务:应用程序可以把一些数据更新组合成一个工作单元,这些更新通常是逻辑相关的,为了保障数据的完整性,所有的更新必须同时成功或者同时失败。

MQ的应用场景:

MQ消息队列是应用松耦合的概念而产生的,主要以队列和发布订阅为消息的传输机制,以异步的方式将消息可靠的传输到消息端,它被广泛的应用在跨平台,跨系统的分布式系统之间,为他们提供高效可靠的异步传输机制。

先了解一下发布-订阅消息模式

  有些网站在注册用户成功后发布一封激活邮件,用户收到邮件后点击激活链接才能使用该网站。一般的做法是在注册用户业务逻辑中调用发送邮件的逻辑。这样用户业务就倚赖于邮件业务。如果以后改为短信激活,注册用户业务逻辑就必须修改为调用发送短信的逻辑。如果要注册后给用户加点积分,再加一段逻辑。经过多次修改,我们发现很简单的注册用户业务已经越来越复杂,越来越难以维护。相信很多开发者都会有类似的经历。

消息中间件 spring boot 消息中间件mq_消息队列

 

 即使用户业务实现中对其他业务是接口倚赖,也避免不了业务变化代来的倚赖影响。怎么解决能?解耦!将注册用户业务逻辑中注册成功后的处理剥离出来。

  再回头看“订阅杂志”,如果没有邮件,出版社就必须自己将杂志送达所有消费者。这种情形就和现在的注册用户业务一样。我们发现问题,在用户业务和其他业务之间缺少了邮件所扮演的角色。

我们把邮局抽象成一个管理消息的地方,叫“消息管理器”。注册用户成功后发送一个消息给消息管理器,由消息管理器转发该消息给需要处理的业务。现在,用户业务只依赖于消息管理器了,它再也不会为了注册用户成功后的其他处理二烦恼。

消息中间件 spring boot 消息中间件mq_数据_02

注册用户的改造就是借鉴了“订阅杂志”这样原始的模式。我们再进一步抽象,用户业务就是消息的“生产者”,它将消息发布到消息管理器。邮件业务就是消息的“消费者”,它将收到的消息进行处

理。邮局可以订阅订阅很多杂志,杂志都是通过某种编号来区分;消息管理器也可以管理多种消息,每种消息都会有一个“主题”来区分,消费者都是通过主题来订阅的。

消息中间件 spring boot 消息中间件mq_消息队列_03

若客户端和服务端需要安全可靠的交互,可以将一个MQ队列作为安全通道,使客户端与服务端能够安全高效的进行异步通信。

消息总线(Message Bus)

对于许多独立开发的服务组成的分布式系统,若要将他们组成一个完整的系统,这些服务必须能够可靠的交互,同事,为了系统的健壮性,每个服务之间又不能过分的紧密的倚赖,这样就可以通过消息总线将不同的服务连接起来,允许它们异步的传递数据。

消息中间件 spring boot 消息中间件mq_消息中间件 spring boot_04

消息中间件 spring boot 消息中间件mq_消息中间件 spring boot_05