3

我正在使用 MSMQ 传输byte数组。

格式化程序是一个BinaryMessageFormatter.

目标队列是私有队列,我使用的是直接 TCP 通信。

目标机器位于不同的 LAN 中,我通过其外部 IP 地址访问它。

有一个防火墙将传入的 TCP 通信路由到实际的目标机器(端口转发)。

所以系统的架构是这样的:

[源机器] --> [目标防火墙] --> [目标机器]

我已经使用该系统几个月了,一切都很好。

最近我们遇到了防火墙故障。

显然,这导致了数据损坏:

虽然队列是事务性的,并且根据 MSMQ,消息已成功传递到目标计算机,但消息的内容已损坏。

也就是说,从队列中读取消息的代码引发了异常:

try
{
    var message = queue.Receive(readTimeout, transaction);
    if (message != null)
    {
        data = (byte[]) message.Body; // this line raises an exception
        return true;
    }
}
catch (Exception e)
{
    Logger.Error("error reading queue", e);
}

我不得不从队列(顶部)删除一些消息,然后系统恢复正常。

我的问题:

假设只是防火墙的故障导致了这种情况,并且知道它是一个事务队列,那么为什么认为消息已传递?
MSMQ 不是在执行某种校验和以确保事务队列上的数据完整性吗?

4

2 回答 2

2

目前看来 MSMQ 在数据完整性和完整性方面完全“信任” TCP 层。

于 2012-05-19T12:16:43.320 回答
0

这只是一个猜测,但我认为分布式事务协调器(DTC)可能在这里遇到麻烦。顾名思义,DTC 负责处理涉及网络中多个系统的事务。

在您的场景中,我可以想象的是,无法通过您的不同 LAN 正确管理事务。

我对您的建议是检查两个网络中涉及的 DTC 实例的配置,是否可以选择启用它们之间的通信和/或研究是否需要设置防火墙以允许 DTC 通信。

于 2012-05-08T11:35:48.633 回答