MQ是IBM开发的一款功能强大的消息中间件,通过通用的消息队列模型实现不同应用和系统之间的可靠数据通信,简化系统开发和集成,实现类似SOA的可重用架构。
IBM MQ提供消息封装和消息排队机制,支持以下四种应用场景。
消息:程序将数据封装成消息进行通信,而不是直接调用对方发送
队列:消息被放入队列中,允许应用独立去处理,不用维持应用之间的逻辑连接。
开发优势:快速开发、方便集成多种平台
- 应用服务器不必同时维持多个应用连接
- 应用无需自己写通信相关的代码、设计应用通信协议
- 可以选择消息处理顺序、安排多个消息处理程序进行负载均衡以及增加可用性
主要特征和好处:
- 取消应用程序之间的直接物理连接,应用程序通过MQ通信
- 时间独立,发送方无需等待接收方回复,发送程序和接收程序解耦
- 小程序,将应用程序分成小部分程序,每个程序完成工作的一部分
- 消息驱动处理,利用触发器,当有消息时自动启动应用进行处理
- 事件驱动处理,利用队里状态信息控制程序处理
- 消息优先级,指定消息优先级,决定消息在队列的位置
- 安全,支持认证、授权、加密等安全机制
- 数据完整性,支持事务特征
- 支持消息恢复,所有消息更新操作被日志记录
消息:Message
封装消息的一种数据结构,主要由控制信息和应用数据构成,其中控制信息封装在消息描述符;
消息描述符:Message descriptor
MQMD(消息队列消息描述符):定义了消息的控制信息,主要由消息类型Type、消息标识符Identifier、消息优先级Priority组成
队列:Queue
按照一定顺序用来收集消息的结构,被指定名称表明消息发送的目的地
队列管理器:Queue Manager
提供队列服务的系统程序,应用程序通过它来管理队列和消息
通道:Channels
提供队列管理器之间通信的对象
消息通道代理:Message channel agent
一个通道由两个消息通道代理组成,一个负责发送,一个负责接收
集群:Cluster
多个消息队列管理器按照某种方式逻辑关联在一起,使用集群为了减少管理负担、增强可用性和负载均衡
MQ MQI client
MQ独立安装组件,允许应用通过MQ client与消息队列服务器通信交互
Point-to-point messaging
点对点消息模型,一个应用生产消息放入队列中,另一个应用从队列中取出处理(消费);
Publish/subscribe messaging
发布/订阅模型,一个应用(被称为发布者)生产消息,该消息每个拷贝被发送给每个感兴趣的应用(订阅者)
Topic
话题,一个特定的字符串用于表示信息的主题,发布者给每个消息指明特定的topic,消息队列管理器负责匹配该topic字段,发送匹配的消息给订阅者
Subscription
应用可以注册订阅特定topic的消息,Subscription(订阅)定义了如何匹配特定的消息,它包含了订阅者(应用)的标识、目标队列的标识(也就是存放发布消息的队列),也包含了一个消息发布如何存放目标队列的信息
消息Message和队列Queue是任何消息队列系统的两大基本组件。
消息
IBM MQ消息由如下三个部分构成:
- 应用数据(Application data):内容和结构由应用程序定义
- 消息描述符(Message descriptor):定义了控制信息,例如消息类型、优先级等,格式由IBM MQ定义(MQMD)
- 消息属性(Message properties):消息的元数据信息,内容由应用定义
消息长度:MQ本身默认最大长度是4MB,理论可以增加到100MB,这个长度仅仅是MQ本身的限制,实际还要受到应用的限制。
队列
用来存储消息的数据结构,每个队列属于特定的队列管理器,队列管理器负责维护队列,并将收到的消息存放到合适的队列里
队列创建:预定义的队列和动态队列
- Predefined queues:管理员使用命令创建(MQSC或PCF),该队列独立于应用,永久存在,即使MQ重启
- Dynamic queues:应用可以从模板队列创建新的队列,创建时可以设置属性,指明是永久的还是临时的
从队列获取消息方式:
- FIFO,先进先出
- 消息优先级,优先级相同时按照FIFO获取消息
- 程序获取指定的消息