• 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开发消息处理程序
  • 相关阅读:
    数据中心
    【Vegas原创】解决cmd窗口不够使用的方法
    【Vegas原创】定期删除archive档的方法
    【Vegas原创】Can't connect to X11 window server using ':0.0' 解决方法
    Linux 操作指令
    【Vegas原创】按自定义格式进行编号的SQL自定义函数
    Error:No description found when saving maintenance plans
    【Vegas原创】巧用任务计划
    svn命令备份
    [转载]R与python共舞
  • 原文地址:https://www.cnblogs.com/ols/p/1073736.html
Copyright © 2020-2023  润新知