一、何为MQ?
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。——百度百科 |
差不多能看懂,简单来说,就跟人们排队买票是一样,只不过排队的不是人,而是消息。
二、MQ概述
要让消息队列能有机动起来,那么一个完整的体系包括什么呢?首先是消息,然后是存放消息的队列,接着就是管理队列的管理器,以及管理器之间通信的信道:
1. 消息
在MQ中,我们把应用程序交由MQ传输的数据定义为消息,我们可以定义消息的内容并对消息进行广义的理解,比如:用户的各种类型的数据文件,某个应用向其它应用发出的处理请求等都可以作为消息。消息有两部分组成:
- 消息描述符(Message Discription或Message Header),描述消息的特征,如:消息的优先级、生命周期、消息Id等;
- 消息体(Message Body),即用户数据部分。
在MQ中,消息分为两种类型:
- 非永久性(non-persistent)消息
- 永久性(persistent)消息
非永久性消息是存储在内存中的,它是为了提高性能而设计的,当系统掉电或MQ队列管理器重新启动时,将不可恢复。当用户对消息的可靠性要求不高,而侧重系统的性能表现时,可以采用该种类型的消息,如:当发布股票信息时,由于股票信息是不断更新的,我们可能每若干秒就会发布一次,新的消息会不断覆盖旧的消息。永久性消息是存储在硬盘上,并且纪录数据日志的,它具有高可靠性,在网络和系统发生故障等情况下都能确保消息不丢、不重。
此外,在MQ中,还有逻辑消息和物理消息的概念。利用逻辑消息和物理消息,我们可以将大消息进行分段处理,也可以将若干个本身完整的消息在应用逻辑上归为一组进行处理。
2. 队列
队列是消息的安全存放地,队列存储消息直到它被应用程序处理。消息队列以下述方式工作:
- 程序A形成对消息队列系统的调用,此调用告知消息队列系统,消息准备好了投向程序B;
- 消息队列系统发送此消息到程序B驻留处的系统,并将它放到程序B的队列中;
- 适当时间后,程序B从它的队列中读此消息,并处理此信息。
由于采用了先进的程序设计思想以及内部工作机制,MQ能够在各种网络条件下保证消息的可靠传递,可以克服网络线路质量差或不稳定的现状,在传输过程中,如果通信线路出现故障或远端的主机发生故障,本地的应用程序都不会受到影响,可以继续发送数据,而无需等待网络故障恢复或远端主机正常后再重新运行。
在MQ中,队列分为很多种类型,其中包括:
- 本地队列
- 远程队列
- 模板队列
- 动态队列
- 别名队列
- …………
本地队列又分为普通本地队列和传输队列,普通本地队列是应用程序通过API对其进行读写操作的队列;传输队列可以理解为存储-转发队列,比如:我们将某个消息交给MQ系统发送到远程主机,而此时网络发生故障,MQ将把消息放在传输队列中暂存,当网络恢复时,再发往远端目的地。
远程队列是目的队列在本地的定义,它类似一个地址指针,