msmq是否确保事务队列上的数据完整性?

时间:2012-05-01 15:04:13

标签: msmq firewall data-integrity transactional-queue

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

格式化程序是BinaryMessageFormatter

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

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

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

所以系统的架构如下所示:

[source machine] --> [destination firewall] --> [destination machine]

我一直在使用这个系统几个月,一切都很顺利。

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

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

虽然队列是事务性的,但根据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执行某种校验和以确保事务队列上的数据完整性?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

这只是猜测,但我认为Distributed Transaction Coordinator(DTC)可能会遇到麻烦。顾名思义,DTC负责处理涉及网络中多个系统的事务。

我在您的方案中可以想象的是,无法通过不同的LAN正确管理交易。

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