MSMQ:偶尔不会发送或收到消息而没有错误
-
20-12-2019 - |
题
我有以下设置和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上的接收器不会以某种方式崩溃/丢失消息吗?因为如果以某种方式处理失败,您的队列不是事务性的,那么这是一个丢失的消息。
无论如何,有许多可能导致为什么这可能会失败。 您有什么样的日志记录(调试/信息级别)?
我认为以下将有助于追踪问题:
- 在Web应用程序中生成事件时。
- 在您通过MSMQ发送来自Web应用程序的事件之前。 当您从队列中获取消息时
- 在接收器中。
以这种方式,您至少可以将发送的消息匹配到接收的消息和处理后的消息。
作为侧面笔记,当您检查源计算机和任何中间跳的死信消息时,不在目的地跳过。如果您没有任何跳跃,那么它们将在Web服务器上转发到非事务性死信队列。