中间件
中间件处于应用软件和系统软件之间,是一种以自己复杂换取企业应用简单化的可复用的基础软件,从技术上讲,中间件是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同应用,能够达到资源共享、功能共享的目的。
中间件分类
消息中间件:适用于任何需要进行网络通信的系统,负责建立网络通信的通道,进行数据或文件传送。消息中间件的一个重要作用是可以实现跨平台操作,为不同操作系统上的应用软件集成提供服务。
交易中间件:适用于联机交易处理系统,主要功能是管理分布于不同计算机上数据的一致性,保障系统处理能力的效率与均衡负载。
对象中间件:基于corba标准的构件框架,相当于软总线,能使不同厂家的软件交互访问,为软件用户及开发者提供一种即插即用的互操作性,就像现在使用集成块和扩展板装配计算机一样。
应用服务器:用来构造internet/internet应用和其他分布式构件应用,是企业实施电子商务的基础设施,应用服务器一般基于j2ee工业标准。
安全中间件:以公钥基础设施(pki)为核心、建立在一系列相关国际安全标准之上的一个开放式应用开发平台,向上为应用系统提供开发接口,向下提供统一的密码算法接口及各种ic卡、安全芯片等设备的驱动接口。
应用集成服务器:把工作流和应用开发技术如消息及分布式构件结合在一起,使处理能方便自动和构件、script应用、工作流行为结合在一起,同时集成文档和电子邮件。
WebSphereMQ原理
WebSphereMQ是基于消息队列和消息传送的中间件,主要功能是在应用程序中间传递消息,这些消息可以在不同的网络协议、不同计算机系统和不同程序之间传递。MQ基本上是由一个消息传输系统和一个应用程序接口组成,其资源就是消息和队列。
消息
消息就是一个信息单元,这个单元消息也可以是一个请求、一个应答,或者一个报告或一份报文。一个消息包含两个因素:消息描述(用于定义诸如消息传输目标)和数据信息(如应用程序数据或数据库查询)。程序之间的通信通过传递消息而非之间调用程序。
队列
队列:一个安全存储消息的地方,消息的存储是顺序,队列是消息分阶段地传送和接收。因为消息存放在队列中,所以应用程序可以相互独立的运行,以不同的速度,在不同的时间,不同的地点。
消息传输系统
消息传输系统:用于确保队列之间的消息提供,包括网络中不同系统上的远程队列之间的消息提供。并保证网络故障或关闭后的恢复。
应用程序接口
应用程序接口:应用程序和消息系统之间通过WebSpherMQ API实现的接口在所有WebSphereMQ的平台上是一样的,API有14个调用,2个关键动词:发送(PUT)和接收(GET)
WebSphereMQ的基本概念
WebSphereMQ的对象
WebSphereMQ对象是一种由WebSphereMQ管理的具有可恢复能力的资源。队列管理器(Queue managers)、队列(Queues)、名字列表(Namelists)、分发列表(Distribution lists)、进程定义(Process definitions)、通道(Channels)、存储类(Storage Classes)这些对象在异种平台上都是统一的。当创建队列管理器时,会自动地创建缺省对象。每一个对象都有一个名字,以便通过命令和MQI调用可以引用它。通常在这些对象类型中每一种对象的名字必须唯一。WebSphereMQ的对象名大小写是区分的。
消息
消息是对它的应用程序有意义的以字节为单位的字符串。消息可以用来实现在相同或不同平台上应用程序间的通信。
WebSphereMQ消息分为两部分:应用程序数据和消息描述符。
应用程序数据:应用程序数据的内容和结构由使用它的应用程序定义。
消息描述符:消息描述符标识消息,并包含其他控制信息,如消息类型和消息的优先级
消息的类型
请求消息(Request Message):请求消息需要应答,从客户端发往服务端的查询和更新信息往往是一条请求信息。请求信息中应当包含回复消息的路由信息,即回复消息应发往什么地方。
回复消息(Reply Message):回复消息是对请求消息的回应。请求消息中的信息决定了回应消息的目的地。处理请求和回应的应用程序控制者消息间的关联,这种关联和队列管理器没有关系,消息自身带有足够的信息供应用程序实现这种关联。
报文信息(Datagram Message):数据包消息是不需要回复的消息,报文消息只是一次单向的消息传送。
报告消息(Report Message):报告消息用于对一些系统故障的响应。有些报告消息是由应用程序创建,有些是由队列管理器创建的。报告消息也可以报告一些事件,消息可能有一个失效时间限制,即如果一条消息在失效时间之后还没有被某个应用程序处理,该条消息将被队列管理器从系统中清除,当队列管理器清除掉一个失效消息之后,它将创建一条报告消息,这条报告消息的目的地址有失效消息提供。
报告消息的一个用途是确保消息的到达。应用程序可以要求它们所发送的消息到达目的地之后收到一条报告消息,这叫做接收确认。应用程序可以要求当另一个程序取走这条消息时它们收到一条报告消息,这叫做交付确认。
触发消息:触发消息是由队列管理器创建的一类特殊消息。WebSphereMQ的队列管理器提供了一种当满足某一条件时,自动触发应用程序的机制,而触发消息是触发机制的重要组成部分。
消息长度
最大消息长度为100MB,缺省最大消息长度4MB。影响消息长度的因素:
接收队列定义的最大长度
队列管理器定义的消息最大长度
传输队列定义的消息最大长度
发送或 接收应用程序定义的最大消息长度
存储消息的可用空间
应用程序处理消息
应用程序使用MQI调用来实现发送和接收消息。
消息放入队列:通过发出MQI MQOPEN打开队列,发出MQI MQPUT调用将消息放入队列
队列取出消息:通过发出MQI MQGET调用,从同一队列中取出消息
队列
队列是用来存储消息的数据结构。
队列的类型
创建方法分类
预定义队列:由管理员使用相应的MQSC或PCF命令创建。预定义队列是永久的,它们的存在与应用程序是否使用它们没有关系,并且WebSphereMQ重启之后也会一直存在。
动态队列:在应用程序发出设定模型队列名的MQOPEN调用时创建的,被创建的队列是基于一个模板队列。可以使用MQSC命令DEFINE QMODEL创建模板队列。动态队列继承了模板队列的属性。模板队列有一个属性可以说明动态队列是永久的还是临时的。永久队列在应用程序和队列管理器重启之后还会存在,临时队列在重启时后消失。
功能分类
本地队列(local queue):一个本地队列是一个物理上位于本地队列管理器中的队列。本地队列实际存在于本地系统的内存和磁盘中。本地队列管理器控制队列的访问,应用程序可以"PUT"消息到本地队列,也可以从本地队列"GET"消息,另外程序还可以查询或修改这些队列的属性,对队列属性的修改需要相应的权限。
远程队列(remote queue):一个远程队列属于一个不与该应用程序直接相连的队列管理器。对这类队列的访问包含有本地队列管理器和远程队列管理器的通信过程。
应用程序可以向远程队列放入消息,但是远程队列不能从远程队列中取出消息。应用程序只能从本地队列中读取消息。
应用程序有两种不同的方法可用来访问远程队列。第一种是当程序打开一个远程队列时同时提供队列管理器名和队列名两个参数,这要求程序知道目的队列属于哪个队列管理器。第二种方法是在本地队列管理器上存在一个远程队列的定义,这个定义包含有足够的信息让本地队列管理器确定该远程队列所在的队列管理器。
传输队列:传输队列是临时存储目标为远程队列管理器的消息的队列。队列管理器利用传输队列把消息分阶段地发送向远程队列。队列管理器和消息移动程序一起负责把数据传送到远程队列。当队列管理器收到把一条消息发往远程队列的要求后,它把消息发送到一个目的队列管理器相关联的传输队列,传输队列位于本地队列管理器上。目的队列管理器的名称可能由应用程序提供,也可以从远程队列定义中得到。
一个传输队列是两个队列管理器之间连接的一端。所有直接目的地是同一队列管理器的消息都可放到同一传输队列上,这些消息的最终目的可能不一样。把消息从一个队列管理器传送到另一个队列管理器只需要一个传输队列,但是也有可能在两个队列管理器之间存在多个连接以提供不同的传输服务,每个连接都带有一个不同传输队列。
传输队列是由MCA处理的,MCA负责在队列管理器之间可靠地传送消息。MCA实际上处理传输队列上消息的MQI应用程序。
动态队列和模板队列:除了固定定义的队列之外,WebSphereMQ还为程序在它们执行时提供了动态创建队列的能力。例如一个应用程序作为某种服务的客户,它可能创建一个动态队列,并通知服务器把对服务要求的响应发送到该动态队列。动态队列总是基于模板队列被创建的,模板队列定义了动态队列的所有属性。当应用程序试图打开一个模板队列时,WebSphereMQ就创建一个动态队列。
动态队列分为两种,它们的生存周期和故障恢复特性不同,在创建临时队列的应用程序关闭时,这些队列将被删除,队列上的消息将被消失,这类动态队列不支持消息的持久性,如果队列管理器发生故障重新启动,临时动态队列也不会被恢复。另一种动态队列是持久动态队列,只有当应用程序关闭持久动态队列定义删除选项,持久动态队列才会被删除。删除持久动态队列的程序不一定是创建持久动态队列的程序,持久动态队列在队列管理器重启后会被恢复,并且支持具有持久性的消息。
启动队列:启动队列是在触发中使用的队列。如果队列管理器将使用触发,则至少为此队列管理器定义一个启动队列。
队列管理器在触发器事件发生时将触发器消息放入到启动队列。
触发器事件是由队列管理器检测的条件的逻辑组合。
例如,当队列上的消息数达到预定义深度时,可能会生成触发器事件。此事件使队列管理器将触发器消息放入指定的启动队列。此触发器消息由触发器监视器(即监视启动队列的特殊应用程序)检索。然后触发器监视器启动在触发器消息中指定的应用程序。
群集传输队列:每个在群集中的队列管理器有一个称为SYSTEM.CLUSTER.TRANSMIT.QUEUE的群集传输队列。作为群集一部分的队列管理器可以将群集传输队列上的消息发送到在同一群集中的任何其它队列管理器。
死信队列:是存储无法发送到其正确目的地的消息的队列。
有时候会出现队列管理器不能把消息发送到目的地的情况,此时消息将被发送到某个死信队列中。
死信队列中的消息常常暗示了系统可能出现的问题。死信队列是WebSphereMQ面对远端系统错误时的一种解决方案。应用程序可以利用WebSphereMQ提供的其他一些工具来监视并确保消息的可靠传送和接收。
在队列管理器创建时,系统会缺省创建一个死信队列,队列名为SYSTEM.DEAD.LETTER.QUEUE。建议在生产系统上,需要独立创建一个死信队列,而不使用系统缺省的死信队列。
命令队列:SYSTEM.ADMIN.COMMAND.QUEUE是用来存放应用管理程序放的具有PCF(program command format)的消息的队列。该队列主要用于编写管理程序时使用。在创建队列管理器时将为每个队列管理器自动创建命名队列。
回复队列:当应用程序发送请求信息时,接收信息的应用程序可以将回复消息发送给应用程序,此回复消息放入到一个称为回复队列的队列中,它通常是发送应用程序的本地队列。回复队列的名称可以作为消息描述符一部分发送应用程序。
别名队列:实际上是本地队列、远程队列定义或队列名表的另一个名字,它是一种简单的额名字到名字的映射,它允许应用程序用另一个名字来访问队列。
定义队列
在WebSphereMQ中定义队列的方法:
在MQSC命令行中使用DEFINE、在程序中使用PCF创建队列命令
队列中检索消息
从队列中检索消息的检索算法:
- 先进先出(FIFO)
- 在消息描述符中定义消息的优先级
- 特定消息的程序请求
队列管理器
在WebSphereMQ中队列管理器是基本的软件系统,队列管理器可以看成是队列和其他对象的容器。WebSphereMQ中的每一个队列都属于一个队列管理器,队列管理器是为应用程序和WebSphereMQ部件(一些管理工具)提供对队列管理器中对象的访问。
一个队列管理器是WebSphereMQ中一个基本的独立的执行单元。一台机器上可以运行一个或者多个队列管理器。
任何需要访问WebSphereMQ提供服务的应用程序都必须先和队列管理器相连,和应用程序相连的队列管理器对应用程序而言就叫"本地队列管理器(LocalQueueManager)",本地队列管理器为应用程序提供MQI调用的支持。应用程序可以操作、管理本地队列管理器所拥有各种资源,也可以向其他队列管理器发送消息。
应用程序通过一种叫做MQI编程接口向队列管理器申请服务。服务包括"取放"消息。
应用程序可以和一个它不知道名字的队列管理器相连,这个队列管理器就是一台机器上的缺省队列管理器,如果程序在调用MQCONN时,把队列管理器参数设置为空,MQCONN将返回与缺省队列管理器连接的句柄。
通道
消息通道
消息通道是一种提供从一个队列管理器到另一个队列管理器的通信路径,它们是应用程序屏蔽了底层的通信协议。
队列管理器可能存在于同种或异种平台之间,为了实现队列管理器之间的通信,必须在一个队列管理器中定义一个发送消息的通道对象,在另一个队列管理器中定义一个接收消息的通道对象。
消息通道是一个单向链接,它通过消息通道代理把两个队列管理器连接起来。
消息通道分类:发送通道、接收通道、服务器通道、请求器通道、群集发送通道、群集接收通道。
消息通道的组合形式
通道的组合形式有5种,每种组合方式是固定的,不能随意组合。每队通道的名称必须相同,否则通道无法启动。
发送通道-接收通道(Sender-Receiver)
请求器通道-服务器通道(Requester-Server)
请求器通道-发送通道(Requester-Sender(callback))
服务器通道-接收通道(Server-receiver)
群集发送通道-群集接收通道(Cluster sender-Cluster receiver)
消息通道用法
发送通道-接收通道(Sender-Receiver)
用法:由一个系统的发送通道来启动通道,以便它可以发送消息到另一个系统。发送通道向接收通道发送启动请求。发送通道从传输队列发送消息到接收通道。接收通道把消息放到目标队列。
请求器通道-服务器通道(Requester-Server)
用法:
1、由一个系统中的请求器通道来启动通道,以便它能从另一个系统接收到消息。请求器通道向通道另一端的服务器通道发送启动请求。服务器通道从传输队列把消息发送到请求器通道。
2、服务器通道也能启动通道,并发送消息到请求器,但这仅应用于完全意义的服务器通道,也即服务器通道定义中应含有对方的连接名。一个完全意义的服务器通道可以由请求器通道启动,也可以发起和服务器通道的通讯
3、最好不要手动停止Server和Request通道,而是依靠Server通道的Discint的属性来停止通道
请求器通道-发送通道(Requester-Sender(callback))
用法:请求器通道启动通道,发送通道终止这次会话。发送通道然后依据它的通道定义中的信息(称为callback)来重新启动会话。它把消息从传输队列发送给请求器通道。最好不要手工去停止Sender和Request通道,而是依靠Sender通道的Discint属性来停止通道
服务器通道-接收通道(Server-receiver)
用法:类似于发送通道-接收通道,但仅应用在完全意义的服务器通道。也即服务器通道定义应含有对方的连接名,通道的启动方是服务器通道。
群集发送通道(Cluster sender)
功能:在一个群集中,每一个队列管理器都有一个群集发送通道,通过它可以把群集信息发送到其中一个队列管理器资源管理器。队列管理器通过这个通道也可以把消息发送到其他的队列管理器。
群集接收通道(cluster receiver)
功能:在一个群集中,每一个队列管理器都有一个群集接收通道。通道这个通道可以接收数据消息和关于群集的消息。
MQI通道
MQI通道是WebSphereMQ客户端和服务器上的队列管理器的通信的通道。当客户端应用程序发出MQCONN或MQCONNX调用时,才开始建立连接。是一个双向的通道,可以负责发送和接收,被用作MQI调用的传送和响应。
一个MQI通道可以把一个客户端连接到单个队列管理器,MQI通道有两种类型,定义了双向的MQI通道。
客户端连接通道:为WebSphereMQ的客户端所用
服务器连接通道:为运行队列管理器的服务器端所使用
消息通道和MQI通道
MQI通道是双向的:一个MQI通道可以用来发送请求,也可以用来接收响应。消息通道只能单向数据通信。,如果两个队列管理器要实现双向通信,则需要定义两个通道,一个是实现数据的发送,另一个是用来实现数据的接收。
MQI通道的通信是同步:当一个MQI请求从客户端发送到服务器端时,WebSphereMQ的客户端在发送下一次请求之间必须要等待服务器端的响应。消息通道在传输的消息与时间无关,发送队列管理器不比等待来自接收队列管理器的任何响应。
群集
在使用分布式排队的传统WebSphereMQ网络中,每个队列管理器是独立的。如果队列管理器需要将消息发送到另一个队列管理器,则它必须定义一个传输队列、一个到远程队列管理器的通道,以及它要将消息发送到每个队列的远程队列定义。
群集是一组以队列管理器可以在不需要传输队列、通道和远程队列定义的情况下在单个网络上彼此直接通信的方法设置的队列管理器。
名称列表
名称列表是包含其他WebSphereMQ队列列表的WebSphereMQ对象。应用程序使用名称列表,它们用于标识一组队列。使用名称列表的优点是它独立与应用程序维护
认证信息对象
队列管理器认证信息对象(AUTHINFO)组成安全套接字层(SSL)安全性的WebSphereMQ支持的部件。它提供使用LDAP服务器检查证书撤销列表(CRL)所需的定义。CRL允许认证中心取消不再可信的证书。
系统缺省对象
系统缺省对象是一组每次创建队列管理器时自动创建的对象定义。可以复制和修改这些对象定义中的任何一个,在安装时用于应用程序。
MQI(Message Queue Interface)
MQI(消息队列接口)组成部分:
函数接口:应用程序通过函数可以访问队列管理器和它的部件。
数据结构:应用程序使用提供的数据接口是用来实现把数据传递给队列管理器,或从队列管理器中获取数据
基本数据类型:也是用来实现从队列管理器传递数据,或从队列管理器中获取数据
WebSphereMQ体系结构
WebSphereMQ的体系结构由很多对象组成,主要包括队列管理器、队列、通道、进程定义等对象。队列管理器和DB2数据库实例类似,它是有一组MQ进程和一些内存空间所组成。它实现了应用程序通过MQI调用可以访问MQ的对象。队列管理器为应用程序提供了排队服务,并管理属于它的队列。
触发机制
队列管理器把某种条件叫做触发事件,如果队列被设置为触发类型并且触发事件发生了,队列管理器发送触发消息到一个叫做启动队列的队列中,触发消息将放置到启动队列过程就意味产生了触发事件。
队列管理器产生的触发消息不是永久性消息,这将减少日志工作量(提高性能),并最小化系统重启时间。
处理启动队列中的消息的程序叫做触发监控程序(trigger-monitor application),它的工作是读取触发消息并根据触发消息的信息做出相应的处理。通常将启动别的应用程序来处理产生触发消息的队列。从队列管理器来看,触发监控车程序只是从启动队列中读取消息。
如果队列被设置成触发形式,可以选择创建一个进程定义(Process-definition)的对象,这个对象包括一个应用程序,这个应用程序用来处理引起触发事件的消息。
如果创建了进程对象,队列管理器就把应用程序名包含在触发消息中,以便触发监控程序可以使用。
进程对象名可以在本地队列的Process-Name的属性中设置啊,每个队列可以配置一个进程对象,或者几个队列可以共享一个进程对象。
触发机制涉及的对象:
应用队列:是一个本地队列,并设为为可触发形式,当触发条件满足时,将会产生触发消息
进程定义:一个应用队列可能由一个进程定义对象和它关联。进程对象定义中包含应用程序的信息。该应用程序负责从应用队列中取出消息。
传输队列:如果用触发方式启动通道,则需要传输队列。传输队列中的TriggerData属性中设置成将被启动的通道名。
触发事件:引起队列管理器产生触发消息的事件
触发消息:对触发事件发生时,队列管理器将产生触发消息。触发信息来自于应用队列和与应用队列关联的进程定义,它包含了将要启动的程序名。
启动队列:也是一个本地队列,它是用来存放触发消息的队列。一个队列管理器可以拥有多个启动队列。一个启动队列可以为多个应用队列服务。
触发监控程序:一个持续运行的程序,当一个触发消息到达启动队列时,触发监控器获取触发消息,并利用触发消息中信息,启动应用程序来处理应用队列中的消息,并把触发消息头发送传递给应用程序,消息头中包含应用队列名。
在所有平台上都有一个特殊触发监控器叫做启动通道,它的作用是用来启动通道。
触发类型
EVERY:当应用队列中每接收到一个消息时,都将产生触发消息。如果应用程序仅处理一个消息就结束时,可采用这种触发类型。
FIRST:当应用队列中的消息从0变为1才会触发事件。如果当队列中的一个消息到达启动应用程序,直到处理完所有消息就结束,则采用这种触发类型。
DEPTH:当应用队列中的消息数目和TriggerDepth的属性值相同时,才会触发事件
触发的工作原理
举例触发类型为FIRST:
1、只有一个本地或远程的应用程序A,往应用队列(Application Queue)中PUT了一条消息
2、当队列原来的深度为0,即队列为空,这时PUT一条消息,深度为1,将会形成触发事件,同时会产生一条触发消息,触发消息中包含进程定义中的信息
3、队列管理器创建触发消息,并把它PUT到与应用队列相关的启动队列
4、触发监控器从启动队列中GET触发消息
5、触发监控器处理触发消息,发出启动应用程序B的命令
6、应用程序B打开应用队列,并处理队列中的消息。
队列管理器群集
群集可以认为是一个队列管理器的网络,或者是一个队列管理器的集合,群集中队列管理器可以是不同操作系统平台。每当您在群集中的一个队列管理器中创建一个接收通道或定义一个队列时,则系统将自动在其他队列管理器中创建相应的发送通道和远程队列定义。
在群集中不需要创建传输队列定义,因为WebSphereMQ在每个队列管理器中已经定义了一个传输队列,这个传输队列可以把消息发送到任何队列管理器中。
群集的信息是放在资源库中,大多数队列管理器值保留对自己所需要的信息,这些信息包括与它们通信的队列管理器和队列的信息,一些队列管理器包含了群集所有队列管理器的所有信息。
CLuster的队列管理器群集
1、这个CLUSTER的队列管理器群集中有三个队列管理器:QM1、QM2、QM3
2、QM1、QM2存放了群集中队列管理器的信息。被称为完全资源队列管理器。
3、QM2、QM3中有几个队列可以被群集中任何其他队列管理器所管理,这些队列被称为群集队列。
4、每一个队列管理器有一个接收通道的定义,它被叫做群集接收通道,用来接收消息。
5、每一个队列管理器有一个发送通道的定义,它被叫做群集发送通道,用来发送消息。
群集接收通道和群集发送通道已经定义好了,通道就会自动启动
群集的优点
1、减少系统管理
2、增强可用性和实现负载均衡:简单的群集易于管理。对于复杂的群集,将提高扩展性和可用性,可以在不同队列管理器中定义相同的队列,因为工作负载可以在群集的队列管理器实现均衡
群集的组件
1、群集资源库(队列)
资源库中存放了群集中队列管理器的信息,包括队列管理器名,以及它们的通道和队列等。这些资源库信息通过一个叫SYSTEM.CLUSTER.COMMAND.QUEUE的队列进行交换,并存放到一个叫SYSTEM.CLUSTER.REPOSITORY.QUEUE的固定队列中。
资源库可能是完全或部分的,每个队列管理器至少要连接到一个拥有完全资源库的队列管理器。
每一个群集队列管理器必须有一个叫SYSTEM.CLUSTER.REPOSITORY.QUEUE的本地队列,在群集中至少一个群集队列管理器含有完全资源库,资源库队列管理器之间必须互连。
2、群集-发送通道
群集-发送通道的类型为TYPE(CLUSSDR),群集队列管理器可以通过群集-发送通道将消息发送到完全资源队列管理器。这个通道被用来通知队列管理器状态的改变,它仅与第一个完全资源库队列管理器联系。
3、群集-接收通道
群集-接收通道的类型为TYPE(CLUSRCVR),群集队列管理器可以使用它接收群集内的消息,每一个群集队列管理器至少需要一个群集-接收通道。
4、群集传输队列
从一个队列管理器发送到其他队列管理器的消息都将被放到SYSTEM.CLUSTER.TRANSMIT.QUEUE队列中,在每个队列管理器中必须存在群集传输队列。
负载均衡
当在群集中含有同一队列的多个实例时,WebSphereMQ通过使用负载管理算法把消息发送到最方便的队列管理器中。
负载管理算法尽可能地选择本地队列管理器作为目的地,如果在本队队列管理器中没有队列,则这个算法用来找到最合适的队列管理器。合适的原则是:通道状态、队列管理器和队列的可用性。在满足合适的队列管理器之间,这个算法采用轮循的方法进行选择。
WebSphereMQ互连通信
互连通信
互连通信对于WebSphereMQ意味把消息从一个队列管理器发送到另一个队列管理器,接收队列管理器可能在本地机器或远程机器。
发送队列管理器和接收队列管理器可以运行在相同平台,也可以是WebSphereMQ所支持的任何平台,这种环境叫做分布式环境。
WebSphereMQ使用DQM(Distributed Queue Management)来实现分布式环境间的通信。
本地队列管理器有时叫做源队列管理器,而远程队列管理器有时被叫做目标队列管理器,或叫做伙伴队列管理器
分布式队列组件原理
- 应用程序使用MQCONN调用连接到队列管理器中
- 然后应用程序使用MQOPEN调用打开一个队列,以便可以把消息放到队列中
- 队列管理器拥有每个队列的定义
- 如果消息的目的地是远程系统的队列,那么本地队列管理器将保存消息直到消息被发送到远程队列管理器
- 每个队列管理器都有叫moving service通信软件,通过这个服务,队列管理器之间可以进行通信
- transport service 不依赖于队列管理器,它可以是下列其中的一种:SNA APPC、TCP/IP、NetBIOS、SPX、UDP
WebSphereMQ分布式组件的定义
1、WebSphereMQ应用程序可以把消息放到自己已连接的队列管理器的队列中
2、队列管理器可以定义属于自己的队列,也可以定义属于其他队列管理器的队列,这些队列叫做远程队列定义
3、消息要发送到远程队列管理器中,本队队列管理器把消息存放到传输队列中直到它消息发送到远程队列管理器。传输队列是一个特殊的本地队列,在传输队列中的消息会被一直保存到被成功发送到远程队列管理器
4、负责消息发送和接收的软件叫消息通道代理(Message Channel Agent)
5、消息是通过通道(channel)来实现队列管理器之间传输,通道是一条两个队列管理器之间的通信的链路,它可以把队列中的所有信息发送到远程队列管理器
发送消息所需要的组件:
如果要将消息发送给远程队列管理器中,那么本地队列管理器需要定义一个传输队列和一个通道,通道的两端都需要分别定义,例如发送端和接收端。一个简单的通道是由本地队列管理器一个发送通道和远程队列管理器一个接收通道所组成,这两个通道必须是相同的名字,并共同构成一个通道。
在通道的每一端也被叫做消息通道代理(MCA)
每一个队列都有一个死信队列(dead-letter queue),也叫不能交付的消息队列,如果消息不能达到目的队列,则被放置到死信队列
接收消息所需要的组件:
如果应用程序需要从远程队列管理器返回到本地队列管理器中,则需要定义另一个通道,它的传输方向与发送方向相反
群集组件
群集是由具有逻辑关系的队列管理器所组成的网络。集群中的任何队列管理器可以发送消息到同一集群其他队列管理器,而不需要显示地定义通道,远程队列和与目标相对应的传输队列。
在群集中队列管理器只有一个传输队列来负责把消息发送到群集中的其他队列管理器中。每个队列管理器只需要一个cluster-receiver通道和一个cluster-sender通道
- "CLUSTER"集群中有三个队列管理器,分别是QM1、QM2和QM3
- QM1和QM2存放了关于集群中的队列管理器和队列的完全资源信息
- QM2和QM3有一些群集队列,这些队列可以被群集中其他队列管理器访问
- 每个队列管理器都有一个叫"TO.qmgr"的cluster-receiver通道,负责接收消息
- 每个队列都有一个cluster-sender通道,该通道可以发送消息到其中一个资源队列管理器中
- 可以使用MQPUT调用把消息发送到任何其他队列管理器,但是只能通过MQGET调用从本地队列取消息
分布式队列组件
分布式队列组件:消息通道、消息通道代理、传输队列、通道启动器和侦听程序、通道出口程序
消息通道代理(MCA)
MAC是一个控制消息发送和接收的程序。在通道的每一端都有MCA,一个MCA是把消息从传输队列取出来,然后放到通讯链路上,另一个MCA接收消息,并把消息放到远程队列管理器的队列中。
初始化通讯链路的MCA叫做呼叫MCA,则另一个MCA叫响应MCA。呼叫MCA可以是发送通道,群集发送通道,服务器通道或请求器通道。响应MCA可以是关联除群集发送通道之外的任何通道
传输队列
传输队列是一个特殊的本地队列,它是用来存放将被发送到远程队列管理器的消息的队列。
如果在远程队列中没有说明传输队列名,那么队列管理器将会寻找一个和远程队列管理器相同名字的传输队列。
可以为队列管理器说明一个缺省传输队列,如果没有说明传输队列名,并且没有定义和远程队列管理器同名的传输队列,那么将会使用这个缺省传输队列
通道启动器和侦听程序
通道启动器为发送通道充当了触发监控器,因为传输队列可以被定义为一个触发队列。当一个消息到达传输队列中,并满足了队列的触发条件,一个触发消息将会被放到启动队列中,通道启动器将取出触发消息来启动相应的发送通道。如果在服务器通道中定义了对方的连接名,则也能触发服务器通道。这意味着基于消息到达传输队列中,使得通道能被自动启动
需要一个通道侦听程序来启动接收MCA,为了响应呼叫MCA的启动请求接收MCA被启动,通道侦听程序探测接入网络请求,并启动相应的通道
通道出口程序
WebSphereMQ的通道出口程序是在MCA执行过程中被调用的。调用通道类型:安全出口、消息出口、发送和接收出口、消息重试出口、通道自动定义出口、传输重试出口
通道出口程序的处理顺序:
1、通道双方初始化成功后,调用通道安全出口,在通道启动阶段,这些必须成功完成才能把消息发送出去
2、通道消息出口程序被发送MCA调用,被发送到接收MCA的每个消息部分都将调用发送出口程序
死信队列
如果消息不能被发送到正确的目的地,那么消息将被发送到死信队列。如果没有定义死信队列,MCA将不能放消息,消息就会被滞留在传输队列中,那么通道就会停止
怎样到达远程队列管理器
多跳(Multi-hopping)
如果源队列管理器和目标队列管理器之间没有直接的通讯链路,从源队列管理器到目标队列管理器之间可能会存在多个中间队列管理器,这种连接方式叫多跳。
在所有的队列管理器之间需要定义通道,在中间的队列管理器需要定义传输队列
共享通道(sharing channels)
为了把消息发送到目标队列管理器,可以在应用程序中说明远程队列管理器名和队列名,或为每一个远程队列创建一个远程队列定义,这个远程队列定义包含了远程队列管理器名,队列名和传输队列名。
总结
简单介绍了一下中间件中的WebSphereMQ的队列管理器队列、通道对象的基本概念和触发机制、体系结构和实现MQ的互连通信的方式。越努力越幸运,赶紧学习起来吧!我是一个正在努力找回自我的人,希望能和一起学习的人成长,有错误的地方请大家帮忙指正,peace&love。