我有以下设置和msmq问题。基于以前的MSMQ经验,我打赌,我缺少的东西,但我只是不知道它是什么。

设置

我有3个负载平衡的Web服务器(允许他们调用它们 w1 w2 w3 )和1个处理某些事件的服务器/数据远离Web请求(我会调用 p )。所有3个Web服务器,一旦在Web应用程序中发生特定事件,将为服务器 p 上的远程私有队列发送消息,然后将从队列中处理每个消息并执行一些消息任务。

问题

在大多数情况下 - 猜测95%的时间 - 一切都运行得很好,但偶尔服务器 p 没有从Web服务器接收消息。这要么是因为<强> w1 w2 w3 都没有发送它们,或者它们不是由 p ,我只是不能说。这意味着我缺少Web应用程序上的用户发生的重要事件,但我无法在自己的日志中找到任何错误。

详细信息

这里是我可以想到的所有细节,这可能有助于解释我的设置以及我到目前为止我想出来的东西:

  • 服务器上的私有队列 p 是非事务性的。
  • 私有队列对每个的权限设置为发送和接收消息。
  • 这是我使用的代码(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应用程序中执行了我的错误处理程序将被捕获并记录它,所以我假设它被发送。

  • w1 w2 w3 上有传出队列,所有人都指向 p - 所有这些都是空的。
  • w1 w2 w3 我看不到任何“死信”消息。
  • p 上私有队列是空的,所以正在处理消息(我可以从我的数据库中验证)。
  • p 上没有“死信”消息。有期刊消息,但它们似乎没有对应任何最近的日期/次。
  • 所有服务器都运行Windows Server 2012。

大部分时间消息都是发出的,但没有任何模式,没有任何模式,有时它们不是。谁能看到出现问题?或向我解释我如何尝试弄清楚正在发生的事情?

有帮助吗?

解决方案

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

无论如何,有许多可能导致为什么这可能会失败。 您有什么样的日志记录(调试/信息级别)?

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

  1. 在Web应用程序中生成事件时。
  2. 在您通过MSMQ发送来自Web应用程序的事件之前。
  3. 当您从队列中获取消息时
  4. 在接收器中。
  5. 以这种方式,您至少可以将发送的消息匹配到接收的消息和处理后的消息。

    作为侧面笔记,当您检查源计算机和任何中间跳的死信消息时,不在目的地跳过。如果您没有任何跳跃,那么它们将在Web服务器上转发到非事务性死信队列。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top