
消息持久性描述
消息可以分成持久性消息和非持久性消息,前者在被放入队列或从队列中取出时除了操
作队列外还会记录日志,所以在队列管理器重启动后消息会自动恢复。后者由于没有日志操
作,消息会丢失。另外,持久性消息通常表示消息是重要的,不可丢失的,在传送发生困难
时,MQ 会尽可能保护消息不丢失。非持久消息在无法送递时往往被丢弃。消息的持久性
与存放消息的队列及传递消息的通道有一定的关系,下图列举了MQ 对象中与消息持久性
相关的属性。
消息头 MQMD 属性 DefPersistence 可以有三种取值,但实际上只有两种有效值,即持
久或非持久。对于 MQPER_PERSISTENCE_AS_Q_DEF,消息在MQPUT/MQPUT1 时会设
置队列的缺省属性。持久的消息可以在队列管理器重启时恢复,非持久的消息则不可以。持
久的消息写入或读出队列的同时会在Log 中记录,所以性能上比非持久消息差不少。
队列属性 DEFPSIST 表示放入其中的消息缺省是持久的 (Persistence) 还是非持久的
(Non-Persistence)。持久消息不可以放入临时动态队列 (Temporary Dynamic Queue)。因为考
虑到临时动态队列可以在 MQOPEN 时创建,在MQCLOSE 时删除,在队列管理器重启后
也会自动清除。这与持久消息不会丢失的性质不相容,所以 WebSphere MQ 禁止持久性消
息放入临时动态队列,在程序运行时报错:MQRC_PERSISTENT_NOT_ALLOWED。
通道的属性 NPMSPEED (Nonpersistent Message Speed) 有两种取值NORMAL 或FAST。
缺省设置为NORMAL,但如果设置成FAST,则非持久消息的传送可以不参加交易。交易
中的非持久消息一旦到达传输队列会立即送出,这可以使非持久消息的传送速度大大加快。
缺点是消息可能丢失,可能泄露到交易之外。丢失指消息传送失败或通道关闭后,消息不会
被回滚到传输队列中。泄露指虽然消息在发送方在交易中进行操作,但因为消息是非持久消
息,一旦放入传输队列就立即送出到达对方,无法回滚。
注:几乎所有的设计人员都会认为系统中出现的每一条消息都是非常重要的,所以都应该是
持久消息。但是在有些性能优先的系统中,适当地采用非持久消息从而保证传递速度也是一
种常用的办法,通常系统会再设计某种机制在出错时进行纠正或业务上的补偿。
评论1