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 に答える