【问题标题】:Does msmq ensure data integrity on transactional queues?msmq 是否确保事务队列上的数据完整性?
【发布时间】:2012-05-11 02:15:00
【问题描述】:

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

格式化程序是BinaryMessageFormatter

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

目标机器在不同的局域网中,我通过它的外部 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 不是在执行某种校验和以确保事务队列上的数据完整性吗?

【问题讨论】:

  • 您要写入的 MSMQ Q 在哪里?
  • @Arnon,如上所述,我正在写入位于不同 LAN 中的不同机器上的队列。
  • 写入队列的代码是什么?
  • 只是在黑暗中拍摄,但您可以考虑使用真正的事务队列,例如 SSB

标签: msmq firewall data-integrity transactional-queue


【解决方案1】:

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

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

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

【讨论】:

  • 尽管如此,即使 DTC 有问题,它怎么会接受消息的传递呢?我认为 MSMQ 理所当然地认为 TCP 层是 100% 完美的,它没有考虑 TCP 级别(或其架构)中的任何类型的故障。
  • @Ron:我想这可能是某种“后备”行为?比如:以某种方式传递消息比传递要好。这是我期望可配置的行为,但我对 DTC 的深度并不精通。
  • 我认为部分交付错过了事务队列中的全部要点。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多