第三部分 Websphere MQ 应用开发
第九章 设计Websphere MQ应用程序
目标
1. 介绍消息和队列的概念。
2. 描述使用WebSphere MQ提供的服务怎样设计和编写应用程序。
9.1介绍应用设计
9.1.1 规划设计
首先需要明确操作系统的平台和环境,针对WebSphere MQ,需要考虑以下因素:
1.队列类型
是使用永久队列、动态队列还是别名队列。
2.消息类型
是使用数据报消息还是请求消息,在一些消息中是否设置不同的优先级。
3.应用程序是否在WebSphere MQ Client运行?
在WebSphere MQ Server 和WebSphere MQ Client运行程序所链接的库是不一样的,运行在WebSphere MQ Client的程序需要链接MQIC库;而运行在WebSphere MQ Server的程序需要链接MQI库。
注意:运行在WebSphere MQ Client的应用程序可以同时连接多个队列管理器。但是运行在WebSphere MQ Server的应用程序不能同时连接多个队列管理器
4.数据的安全性和完整性
可以使用上下文信息来验证数据的安全性,使用同步点机制来确保数据的一致性。也可以使用消息的永久性特征来确保重要数据的传递。
5.怎样处理意外和错误
需要考虑怎样处理不能交付的消息,以及怎样处理队列管理器产生的报告消息。
9.1.2 WebSphere MQ 对象
MQI可以使用以下对象:
队列管理器
队列
名字列表
进程定义
通道
存储类(仅WebSphere MQ for Z/OS支持)
授权信息对象 (AUTHINFO objects)
除动态队列之外,其他对象都需要在定义之后使用。定义的方法有PCF,MQSC,这些对象被定义之后可以被查看,修改和删除。
9.1.3 设计消息
当使用MQI接口PUT消息到队列中时,将产生一个消息。该消息有控制信息(Message Description)和应用数据组成,在应用程序中使用消息时,需要考虑以下因素:
消息类型
在应用程序中的消息是一个简单消息,还是一个请求消息。如果是请求消息,请求-回复的处理方式是异步还是同步。还有就是所有的消息是否在同一个工作单元。
消息优先级
在发送应用程序中可以为每个消息设置优先级再放到队列中。如果队列的消息交付方式也设置为优先级方式,则接收程序将总是先取出优先级最高的消息。如果队列的消息交付方式也设置为先进先出方式,则接收程序将按先进先出方式取出队列中的消息。
消息的永久性
当队列管理器重新启动,是否希望保留队列中的消息,如果需要保留,则把消息设置成永久性的,如果不需要保留,则把消息设置成非永久性的。
9.1.4 WebSphere MQ 技术
如果仅编写一个简单的WebSphere MQ应用程序,只需要确定在应用程序中使用的WebSphere MQ对象和消息类型,对于编写更高级的应用程序,可能会使用如下技术:
等待消息
可以采用轮循机制从队列中取出消息或设置等待消息时间,如果消息到达则取出,否则超时则返回。
关联回复
把请求消息中的消息标识(MsgId)复制到回复消息的关联标识(CorrelID)中。
上下文信息(Context information)
上下文信息对于安全,审计和问题确定是很有用。
自动启动WebSphere MQ应用程序
WebSphere MQ触发机制,当消息到达队列时,自动启动应用程序处理消息。
产生消息报告
在应用程序可以请求产生多种报告消息,例如,意外报告(Exception reports)、失效报告(Expiry reports)、到达确认报告(Confirm-on-arrival reports)、交付确认报告(Confirm-on-delivery reports)、PAN报告(Positive action notification reports)和NAN报告(Negative action notification reports)等。
群集和消息的紧密联系
在WebSphere MQ群集里,消息可以被放到群集中任何队列管理器的相应队列,因此消息间的紧密联系可能被变得松散。
9.1.5应用编程
WebSphere MQ支持IBM MQI(Message Queue Interface)和AMI(Application Messaging Interface)。MQI包括一些发送和接收消息以及操作WebSphere MQ对象的API调用。AMI是一个比MQI更简单的调用接口。
调用接口
MQI接口可以实现以下功能:
连接和断开队列管理器。
打开和关闭对象(例如,队列、队列管理器和名字列表和进程)
放消息到队列中。
从队列中接收消息或浏览消息。
查询WebSphere MQ对象的属性,并可以设置队列的某些属性。
提交和回滚事务。
协调队列管理器与别的资源管理器的更新。
MQI接口提供了放消息和取消息的结构。也提供了许多常量。
应用程序的性能
使应用程序的处理尽量并行操作。
MQCONN/MQDISC是最耗CPU的两个函数,其次是MQOPEN和MQCLOSE这两个函数,因此要尽量避免必要地重复使用这几个函数。比如,当您需要从队列中读取多条消息时,正确的编程方法应该如下:
MQCONN
MQOPEN
MQGET
.
.
.
MQGET
MQCLOSE
MQDISC
即:连接/断开队列管理器一次,打开/关闭队列一次,读取消息多次。而不应该反复建立与队列管理器的连接和反复进行队列打开/关闭操作。
如果应用程序放一条消息到队列中,则应该使用MQPUT1函数。
当处理一批消息时,可以采用MQCMIT函数,将若干消息作为一个完整的交易来处理,消息将作为一个batch统一提交,而不是一个个地分别提交,因此,可以提高性能。尤其对于永久性的消息效果更加明显。
尽量减小消息的大小,小消息的读取效率要高。对于mqget, mqput这两个函数而言,8k以下的消息的耗时差别不大,8k到128k的消息的耗时随着消息大小的增加而增加。大于128k的消息耗时较大,因为当与队列相关的内存满了的时候,会有硬盘交换。
同时要注意,从传输效率而言,如果在广域网上进行消息传输,消息太小会影响传输效率,因为对于每一消息,MQ都会有一个消息头,它会占有一定的字节数,如果把消息拆分太小,每个消息的传输头都会占据一定的开销。
如果消息不必可恢复,则在应用程序中可使用非永久性消息。
使用Distribution List 方式来把相同的消息发往不同的目的地。
用match correlation ID的方法取消息比不匹配性能要差。
通常,我们使用MQCONN这个函数建立与队列管理器的连接,除此之外,MQ支持trusted application binding,即fastpath binding,用MQCONNX来实现。当从性能方面考虑时,我们可以使用MQCONNX来提高性能。
9.1.6 测试应用程序
WebSphere MQ应用程序的开发环境和其他应用程序的一样。因此您可以使用和WebSphere MQ trace工具一样的开发工具。
9.2 WebSphere MQ消息
9.2.1消息描述符
通过使用MQMD结构,可以访问消息中的控制信息。关于MQMD结构的更详细的描述,请参看《WebSphere MQ Application Programming Reference》。
9.2.2消息种类
WebSphere MQ定义了四种类型的消息:
数据报消息
请求消息
回复消息
报告消息
应用程序可以使用前三种消息来实现它们之间的信息交换。第四种,报告消息是应用程序和队列管理器用来报告关于例如错误发生的事件。
每种消息类型都是使用MQMT_*来定义的。您也可以自定义消息类型。
9.2.3消息控制信息和消息数据的格式
队列管理器仅关心消息控制信息格式,而处理消息的程序则既关心消息的控制信息,也关心消息数据格式。
9.2.3.1消息控制信息格式
在消息描述的character-string字段中的控制信息必须是在队列管理器的CodedCharSetId属性值定义的字符集。因为当应用程序把消息从一个队列管理器发送到另一个队列管理器时,传输消息的消息通道代理需要使用这个属性值来确定是否需要对消息进行数据转换。
9.2.3.2消息数据格式
在应用程序中可以定义应用数据格式、字符数据的字符集和数字数据的格式。为设置这些格式需要使用下列字段:
Format
这个字段向消息的接收者说明了消息中应用数据的格式。
CodedCharSetId
这个字段表示了消息中的字符数据的字符集。
Encoding
这个字段描述了数字消息数据的格式。
9.2.4消息优先级
当应用程序放消息到队列中时,您可以设置消息的优先级(在MQMD结构的Priority字段设置)。
队列的MsgDeliverySequence属性决定了队列中的消息是以先进先出方式存放,还是以优先级内先进先出方式存放。如果队列的这个属性设置成MQMDS_PRIORITY,队列中的消息将以消息描述符的Priority字段的优先级进行排队。但如果队列的这个属性设置成MQMDS_FIFO,队列中的消息将以消队列的缺省优先级进行排队,相同优先级消息的存放次序是取决于到达的次序。
当消息放到队列中时,如果没有设置消息优先级,那么将会自动使用队列的DefPriority属性定义的缺省优先级。在WebSphere MQ系统中,可以对消息设置0(最低)至9(最高)的10类优先级。
9.2.5消息组
一个消息组是由一个或多个逻辑消息组成的。一个逻辑消息是由一个或多个物理消息组成。
组
每个组是通过GroupId来标识的。它是由一个或多个包含同样GroupId的消息组成。这些消息可以存放在队列中的任何位置。
图,一组逻辑消息
逻辑消息
在组里的逻辑消息是通过GroupId和MsgSeqNumber来标识的。在一个组里的第一个消息的MsgSeqNumber值是从1开始。如果组里的逻辑消息没有被分成段,则组里的逻辑消息是由一个物理消息组成。
段(Segment)
段是用来处理对于应用程序或队列管理器来说太大消息。消息中的段是由GroupId,MsgSeqNumber和Offset来标识的。每个段是由一个物理消息组成。
图,分段消息
9.2.6消息持久性
永久消息需要写到日志和队列文件中。当队列管理器失败后重新启动时,它将会从日志数据中恢复所需要的永久消息,如果队列管理器停止,非永久性消息将被丢弃。
当您创建消息时,如果使用缺省值初始化消息描述符(MQMD)。消息的永久性是由MQOPEN的队列的DefPersistence所决定的。您也可以使用MQMD中的Persistence字段来设置消息的永久性。
如果使用永久性消息将会影响应用程序的性能。影响的程度由系统I/O子系统的特性和使用的同步点选项所决定的。
9.2.7检索消息
为从队列中获得一个特殊消息,您需要使用消息描述符中的MsgId和CorrelId字段。如
果使用了版本2的MQMD结构,还需要使用GroupId字段。
当消息被放到队列中时,队列管理器将产生消息描述符。队列管理器试图确保消息描述符是唯一的,然而WebSphere MQ应用程序也能设置消息描述符中的值。
9.2.8交付失败的消息
当队列管理器不能把消息放到队列时,可以使用下列处理办法:
再次把消息放到队列中。
把消息返回到发送方。
把消息放到死信队列中。
9.3本章小结
介绍WebSphere MQ应用程序设计的要点和怎样编写以及测试应用程序。在设计应用程序过程中的一个重要环节就是设计合适的WebSphere MQ消息。
9.4本章练习
1. 列出WebSphere MQ应用程序的设计步骤。
2. 列出WebSphere MQ消息的设计种类。
ibmMQ第三部分第九章
最新推荐文章于 2024-04-02 08:35:07 发布