一、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的消息会被所有订阅者消费。
3、JMS编程模型
ConnectionFactory:创建Connection对象的工厂,针对两种不同的jms消息模型,分别有QueueConnectionFactory和TopicConnectionFactory两种。可以通过JNDI来查找ConnectionFactory对象。
Destination:destination:是指消息所走通道的目标定义,也就是用来定义消息从发送端发出后要走的通道,而不是最终接收方
Connection:Connection:表示在客户端和JMS系统之间建立的链接(对TCP/IP socket的包装)。
Session:Session:是我们操作消息的接口。可以通过session创建生产者、消费者、消息等。Session提供了事务的功能。当我们需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中。
消息的生产者:消息生产者由Session创建,并用于将消息发送到Destination。
消息消费者:消息消费者由Session创建,用于接收被发送到Destination的消息。
MessageListener:消息监听器。如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。
应用场景:
1、 应用解耦-场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。
传统模式的缺点:
1) 假如库存系统无法访问,则订单减库存将失败,从而导致订单失败;
2) 订单系统与库存系统耦合;
引用消息队列后
订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。
库存系统:订阅下单的消息,获取下单信息,库存系统根据下单信息,进行库存操作。
假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦。
2、 流量削锋-场景说明:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。
a、可以控制活动的人数
b、可以缓解短时间内高流量压垮应用