2012-05-01 7 views
3

MSMQを使用してbyteアレイを転送しています。msmqはトランザクションキューのデータの整合性を保証しますか?

フォーマッタは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はトランザクションキューのデータの整合性を保証するために何らかのチェックサムを実行していませんか?

+0

書き込み先のMSMQ Qはどこですか? –

+0

@Arnonは、前述のように、別のマシンの別のLANにあるキューに書き込んでいます。 –

+0

キューに書き込むためのコードは何ですか? –

答えて

2

現在、データの整合性と完全性に関しては、MSMQがTCP層を完全に「信頼する」ように見えます。

0

これは単なる推測ですが、私はDistributed Transaction Coordinator(DTC)がここで問題を抱えていると思います。この名前が示すように、DTCはネットワーク内の複数のシステムを含むトランザクションの処理を担当します。

あなたのシナリオで想像していたことは、異なるLAN上でトランザクションを正しく管理できないことです。

DTC通信を許可するようにファイアウォールを設定する必要がある場合、それらの間の通信を可能にするオプションがある場合、両方のネットワークの関連するDTCインスタンスの設定を確認することをお勧めします。

+0

DTCに問題があっても、どのようにメッセージの配信が受け入れられますか?私は、MSMQがTCP層が100%完璧であり、TCPレベル(またはそのアーキテクチャ)のあらゆる種類の失敗を考慮に入れていないと思っています。 –

+0

@Ron:これは、ある種の「フォールバック」行動かもしれないと思いますか?のように:メッセンジャーを提供する*何とか*は、全く提供していない*より優れています。これは私が*構成可能であると期待している動作ですが、私はこの深みでDTCに精通していません。 –

+0

私は部分的な配信がトランザクションキュー内のすべてのポイントを失うと思います。 –

関連する問題