MSMQ的一些特性

2006/10/19
今天上网找MSMQ的资料,发现中文资料非常少,根据英文资料,写一点它的特性。
MSMQ是微软的一项系统组件,功能类似于队列中间件。
MSMQ支持简单类型的数据(如int)和复杂类型的数据(如结构体)。
MSMQ支持三种消息发送模式:
  • Express,快递模式,在把消息发送到MSMQ服务器之前,不把消息保存在文件中。速度最快。
  • Recoverable ,可恢复模式。在把消息发送到MSMQ服务器之前,把消息保存在文件中。所以发生异常关机等情况时,消息仍会被发送到MSMQ服务器。速度其次快。
  • Transactional ,与第二种比较类似,但有更多的功能:保证一条条消息发送的顺序,保证每条消息只发送一次等。速度最慢。
上述发送模式中,前两种会出现一条消息多次发送的情况,程序员或MSMQ的使用者需要自己解决重复消息的问题。
MSMQ 支持向多个队列发送消息,可以设置队列的属性(这方面和IBM MQ比较类似,等找到文档再详细写),设置消息的优先级等。
MSMQ的不好处:缺少管理工具,只能通过MMC(计算机管理/控制台)对其进行管理,但MMC提供的功能非常少,像删除队列中的消息、把消息从一个队列复制到另一个队列等功能都是没有的(可以自己变程序实现,或使用第三方的软件如MqExplorer)。
MSMQ服务器是否支持永久队列(消息发送到队列后,重启MSMQ或重启电脑,数据不丢失)还不确定,没有看到相关的文档。


Tip1: 比较有用的几个MSMQ Queue Properties(属性)
PROPID_Q_BASEPRIORITY,定义queue的优先级。
PROPID_Q_LABEL,表示队列的描述信息。
PROPID_Q_TYPE,定义队列提供的服务。
(根据微软官方文档MSMQ Queue Properties翻译/整理而成)


Tip2: 比较有用的几个MSMQ msg Properties(属性)
PROPID_M_TIME_TO_BE_RECEIVED,定义msg的“存活”时间,以秒为单位,默认值为INFINITE(无限)。
PROPID_M_PRIORITY,定义msg的优先级。
PROPID_M_LABEL,表示msg地描述信息。
PROPID_M_JOURNAL,定义msg超时之后是否移到dead-letter(死信)队列中,也有其他用处。
PROPID_M_DEST_QUEUE,定义msg发送到哪个队列。
PROPID_M_DELIVERY,定义msg的发送方式,有EXPRESS(默认)/RECOVERABLE两种模式。注:事务型的发送通过其他函数实现。
PROPID_M_CLASS,msg的类型
PROPID_M_BODY_TYPE, msg body type(msg中包含的数据的类型)。
PROPID_M_BODY,msg body(msg中包含的数据)。
(根据微软官方文档MSMQ msg Properties翻译/整理而成)


Tip3: Message(msg) queueing -> msg -> msg body type
发送和接收消息的时候,要注意所使用的函数和msg body type。
如果用MSMQMessage.Send()发送消息,以及用MSMQQueue的peak()或receive()函数接收消息,msg Queueing会自动判断msg body type。这种做法的优点是编程方便,缺点是速度和性能方面会有一点损失。
如果使用MQSendMessage()发送消息,需要程序员在调用该函数之前设置msg body type,不然会被自动设置为VT_EMPTY。如果使用MQReceiveMessage()或MQReceiveMessageByLookupId ()接收消息,则需要程序员判断消息的msg body type,避免出错。这种做法的优点是速度方面会稍微快一点,但编程稍微麻烦些。
(以上根据微软官方文档 msg body type翻译/整理而成)
根据微软官方的性能测试文档(System.Messaging PerformanceSystem.Messaging 性能 MSMQ-MQSeries Bridge Performance Results),两年前主流配置的电脑,对于int, string(不超过10,000字符),并且收/发小于3000条/s的应用,第一种做法就可以了。


Tip4: msg的大小
(根据msmqFaqpub.doc),MSMQ中的采用内存映射的方式,把msg保存在文件中,文件的固定大小是4M,所以msg的上限是4M


Tip5: 在程序中判断有没有安装MSMQ的方法
(根据msmqFaqpub.doc)用LoadLibrary()加载Mqrt.dll,如果加载失败,说明没有安装MSMQ。


Tip6: 清空队列
(根据msmqFaqpub.doc)默认地,MSMQ清除队列中msg的方法是将其标记为“无用”,真正的清除(物理上删除)是6小时一次。如果想改变这个频率,就要改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ MSMQ\Parameters项下面的MessageCleanupInterval


参考网址
微软官方文档 MSMQ3.0 Feature List(特性列表)
微软官方文档 消息队列
微软官方文档 MSMQ Refernece
微软官方文档 MSMQ属性
MSDN 中文版 Message Queueing

消息队列简介及其使用(介绍比较详细,同时讲了C#中如何编程)
Message Queue(消息队列)介绍与应用(介绍非常详细,没有讲如何编程)
在VB.NET中使用MSMQ(对消息队列和MSMQ作了简要介绍)
使用C#和MSMQ开发消息处理程序
原文地址:https://www.cnblogs.com/ols/p/1073736.html