一、MQ消息中间件

MQ是什么?

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

简单点说:MQ就是一个消息的接受和转发的容器,可用于消息推送。


MQ的相关概念

1、 消息(Message

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

2、 列队(Queue

队列是用来存放消息的,把消息存放到队列中,直到应用程序或其他MQ对象来处理或取走。

3、 队列管理器(Queue Manager)

队列管理器时一个负责向应用程序提供消息服务的机构

4、 通道(Channel

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


5、 监听器(listener

接收消息的时候,侦听一个端口,等待发送方的连接。


JMS基本概念

JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API

用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程。而mq则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者。


JMS是一种与厂商无关的 API,用来访问消息收发系统消息。它类似于JDBC(Java DatabaseConnectivity):这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。


JMS-消息模型

1、点对点:Queue,不可重复消费

消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。

消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。




2、发布/订阅:Topic,可以重复消费

消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。



3JMS编程模型

ConnectionFactory创建Connection对象的工厂,针对两种不同的jms消息模型,分别有QueueConnectionFactoryTopicConnectionFactory两种。可以通过JNDI来查找ConnectionFactory对象。


Destinationdestination是指消息所走通道的目标定义,也就是用来定义消息从发送端发出后要走的通道,而不是最终接收方


ConnectionConnection表示在客户端和JMS系统之间建立的链接(对TCP/IP socket的包装)。


SessionSession是我们操作消息的接口。可以通过session创建生产者、消费者、消息等。Session提供了事务的功能。当我们需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中。


消息的生产者:消息生产者由Session创建,并用于将消息发送到Destination


消息消费者:消息消费者由Session创建,用于接收被发送到Destination的消息。


MessageListener消息监听器。如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。


应用场景:

1、 应用解耦-场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。



传统模式的缺点:

1) 假如库存系统无法访问,则订单减库存将失败,从而导致订单失败;

2) 订单系统与库存系统耦合;

引用消息队列后



订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。

库存系统:订阅下单的消息,获取下单信息,库存系统根据下单信息,进行库存操作。

假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦。


2、 流量削锋-场景说明:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。



a、可以控制活动的人数

b、可以缓解短时间内高流量压垮应用