MSMQ:偶尔没有发送或接收的消息没有错误

时间:2014-07-29 09:32:56

标签: c# msmq windows-server-2012

我对MSMQ有以下设置和问题。根据之前的MSMQ经验,我认为这是一件很简单的事情,但我不知道它是什么。

设置

我有3个负载均衡的网络服务器(我们称之为服务器 W1 W2 W3 )和1个处理某些事件的服务器/数据远离网络请求(我称之为 P )。所有3个Web服务器,一旦在Web应用程序中发生特定事件,将向服务器 P 上的远程专用队列发送消息,然后将从队列中处理每个消息并执行一些任务。

问题

在大多数情况下 - 在95%的时间内猜测 - 一切运行正常,但偶尔服务器 P 不会从Web服务器接收消息。这可能是因为 W1 W2 W3 未发送它们或 P 未接收到它们,我无法告诉你。这意味着我错过了Web应用程序上用户发生的重要事件,但我找不到自己日志中列出的任何错误。

详情

以下是我能想到的所有细节,这些细节可能有助于解释我的设置以及我到目前为止所发现的内容:

  • 服务器 P 上的专用队列是非事务性的。
  • 专用队列具有 Everyone 对发送和接收消息的权限设置。
  • 这是我使用的代码(C#)将消息发送到远程专用队列:

    var queue = new MessageQueue(@"FormatName:DIRECT=OS:ServerP\PRIVATE$\MyMessageQueue");
    
    var defaultProperties = queue.DefaultPropertiesToSend;
    defaultProperties.AcknowledgeType = AcknowledgeTypes.FullReachQueue | AcknowledgeTypes.FullReceive;
    defaultProperties.Recoverable = true;
    defaultProperties.UseDeadLetterQueue = true;
    defaultProperties.UseJournalQueue = true;
    
    queue.Send(requestData);
    
  • 使用上面的代码发送消息似乎不会引发异常 - 如果它在我的Web应用程序中的错误处理程序将捕获并记录它,所以我假设它被发送。< / p>

  • W1 W2 W3 上的传出队列都指向 P 上的私人队列 - 所有这些都是空的。
  • W1 W2 W3 上,我看不到任何&#34;死信&#34;消息。
  • P 上,专用队列为空,因此正在处理消息(我可以从我的数据库中验证)。
  • P 上没有&#34;死信&#34;消息。有日记信息,但它们似乎与最近的日期/时间相对应。
  • 所有服务器都运行Windows Server 2012。

大多数情况下,邮件的发送,接收和处理都很好,但没有任何模式可见,有时它们不是。任何人都可以看到出了什么问题?或者向我解释我如何尝试弄清楚发生了什么?

1 个答案:

答案 0 :(得分:1)

你确定P上的接收器不会以某种方式崩溃/丢失消息吗?因为您的队列不是事务性的,如果以某种方式处理失败,那么这就是丢失的消息。

无论如何,有很多可能的原因导致这种情况失败。 您有什么样的日志记录(DEBUG / INFO级别)?

我认为以下内容有助于追踪问题:

  1. 在网络应用中生成事件时。
  2. 在您通过网络应用程序发送活动之前,通过MSMQ。
  3. 当您从队列中收到消息时,在接收器中。
  4. 这样,您至少可以将已发送的消息与已接收的消息和已处理的消息进行匹配。

    作为附注,当您检查死信消息时,您在源计算机和任何中间跃点上进行检查,而不是在目标跃点上。如果您没有任何跃点,则它们将被中继到Web服务器上的非事务性死信队列。