代码改变世界

消息队列(Message Queuing)

2010-08-26 23:03  Clingingboy  阅读(13572)  评论(2编辑  收藏  举报

      消息队列属于Windows系统组件服务。.net对其进行了封装.其可以为我们提供非常好的分布式应用服务

可以通过Visual Studio打开Message Queues并查看消息

image_2  

或者可以通过我的电脑右键管理菜单查看服务也可以.

image_4

以下是其特性,来自MSDN的解释

  • 稳定性 — 组件失败对消息的影响程度远远小于组件间的直接调用,因为消息存储在队列中并一直留在那里,直到被适当地处理。消息处理同事务处理相似,因为消息处理是有保证的。

  • 消息优先级 — 更紧急或更重要的消息可在相对不重要的消息之前接收,因此可以为关键的应用程序保证足够的响应时间。

  • 脱机能力 — 发送消息时,它们可被发送到临时队列中并一直留在那里,直到被成功地传递。当因任何原因对所需队列的访问不可用时,用户可以继续执行操作。同时,其他操作可以继续进行,如同消息已经得到了处理一样,这是因为网络连接恢复时消息传递是有保证的。

  • 事务性消息处理 — 将多个相关消息耦合为单个事务,确保消息按顺序传递、只传递一次并且可以从它们的目标队列中被成功地检索。如果出现任何错误,将取消整个事务。

  • 安全性 - MessageQueue 组件基于的消息队列技术使用 Windows 安全来保护访问控制、提供审核并对组件发送和接收的消息进行加密和验证。

以下是我的理解

1.脱机能力 数据库难免有挂的时候,可以暂时把数据存在这里,然后处理.保证了相应的时间

2.数据批量处理 可以预先把数据存放此处,待一定时间批量进行处理,进一步提高了程序的吞吐能力

3.消息队列顾名思义,当然有消息队列优先级之分

4.最大的好处则是可用于分布式应用,用户则不需要关心是否是数据库。其实是一个非常好的数据缓存存储器了,而不会因为机器挂掉而资料丢失

来看一段基本的代码

static void Main(string[] args)
   {
     String queuename = @".\private$\NOTIFICATIONS";
 
     if (!MessageQueue.Exists(queuename))
     {
       MessageQueue.Create(queuename);
     }
 
     MessageQueue que = new MessageQueue(queuename);
     que.Formatter = new BinaryMessageFormatter();
 
     while (true)
     {
       using (Message msg = que.Receive())
       {
         String str = (String) msg.Body;
         Console.WriteLine("Received: {0}", str);
       }
     }
   }


队列的几个概念

  • “公共队列”在整个“消息队列”网络中复制,并且有可能由网络连接的所有站点访问。

  • “专用队列”不在整个网络中发布。相反,它们仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的应用程序访问。

  • “管理队列”包含确认在给定“消息队列”网络中发送的消息回执的消息。指定希望 MessageQueue 组件使用的管理队列(如果有的话)。

  • “响应队列”包含目标应用程序接收到消息时返回给发送应用程序的响应消息。指定希望 MessageQueue 组件使用的响应队列(如果有的话)。

系统生成的队列一般分为以下几类:

  • “日记队列”可选地存储发送消息的副本和从队列中移除的消息副本。每个“消息队列”客户端上的单个日记队列存储从该计算机发送的消息副本。在服务器上为每个队列创建了一个单独的日记队列。此日记跟踪从该队列中移除的消息。

  • “死信队列”存储无法传递或已过期的消息的副本。如果过期消息或无法传递的消息是事务性消息,则被存储在一种特殊的名为“事务性死信队列”的死信队列中。死信存储在过期消息所在的计算机上。有关超时期限和过期消息的更多信息,请参见默认消息属性

  • “报告队列”包含指示消息到达目标所经过的路由的消息,还可以包含测试消息。每台计算机上只能有一个报告队列。

  • “专用系统队列”是一系列存储系统执行消息处理操作所需的管理和通知消息的专用队列。