7

一連の NServiceBus サービス用に MSMQ をクラスター化しましたが、クラスター化されなくなるまですべてが正常に動作します。1 つのサーバーの発信キューがいっぱいになり始め、すぐにシステム全体がハングします。

詳細:

サーバー N1 と N2 の間にクラスター化された MSMQ があります。他のクラスター化されたリソースは、クラスター化されたキューでローカルとして直接動作するサービスのみです。つまり、NServiceBus ディストリビューターです。

すべてのワーカー プロセスは、Services3 と Services4 という個別のサーバー上にあります。

NServiceBus に慣れていない方のために説明すると、作業はディストリビューターによって管理されるクラスター化された作業キューに入ります。Service3 と Services4 のワーカー アプリは、同じディストリビューターが管理するクラスター化されたコントロール キューに「I'm Ready for Work」メッセージを送信し、ディストリビューターはワーカー プロセスの入力キューに作業単位を送信して応答します。

ある時点で、このプロセスが完全に停止する可能性があります。システムがハングしたときのクラスター化された MSMQ インスタンスの発信キューの図を次に示します。

ハング状態のクラスター化された MSMQ 送信キュー

クラスターを別のノードにフェイルオーバーすると、システム全体が混乱するようなものです。フェールオーバー直後の同じクラスター化された MSMQ インスタンスの図を次に示します。

フェールオーバー後のクラスター化された MSMQ 送信キュー

システムをスムーズに実行し続けるために、この動作と、それを回避するためにできることを誰か説明できますか?

4

3 に答える 3

2

1 年以上経った今、私たちの問題は解決したようです。重要なポイントは次のとおりです。

  • MSMQ がホストを解決する必要がある場合に解決できるように、しっかりした DNS システムがあることを確認してください。
  • Windows フェールオーバー クラスターでは、クラスター化された MSMQ のインスタンスを 1 つだけ作成します。

Windows フェールオーバー クラスターをセットアップしたとき、非アクティブなノードでリソースを "浪費" するのは良くないと想定しました。 そのため、その時点で準関連の NServiceBus クラスターが 2 つあったため、Project1 のクラスター化された MSMQ インスタンスを作成しました。 、および Project2 の別のクラスター化された MSMQ インスタンス。ほとんどの場合、それらを別々のノードで実行し、メンテナンス期間中は同じノードに配置することにしました。結局のところ、これは SQL Server 2008 のプライマリ インスタンスと開発インスタンス用のセットアップであり、非常にうまく機能しています。

特に、各 MSMQ インスタンスを 1 回か 2 回フェールオーバーすると、常にメッセージが再び移動するように思われるため、ある時点で、このアプローチについて疑念を抱くようになりました。

Udi Dahan (NServiceBus の作者) にこのクラスター化されたホスティング戦略について尋ねたところ、彼は困惑した表情で「なぜそのようなことをしたいのですか?」と尋ねました。実際には、Distributor は非常に軽量であるため、使用可能なノード間で均等に分散する理由はほとんどありません。

その後、学んだことをすべて取り入れて、MSMQ インスタンスが 1 つだけの新しいフェールオーバー クラスターを再作成することにしました。それ以来、この問題は発生していません。もちろん、この問題を確実に解決することは否定的であり、不可能です。少なくとも 6 か月間は問題はありませんでしたが、明日には失敗する可能性があると思います。そうでないことを望みましょう。

于 2011-12-22T17:37:57.677 に答える
2

サーバーが複製され、同じキュー マネージャー ID (QMId) を共有している可能性があります。

MSMQ は、リモート マシンのアドレスをキャッシュするためのハッシュとして QMId を使用します。ネットワーク内で複数のマシンが同じ QMId を持っている場合、メッセージがスタックまたは欠落する可能性があります。

このブログ投稿の説明と解決策を確認してください:リンク

于 2010-11-08T19:11:59.900 に答える
1

サブスクリプションを永続化するようにエンドポイントをどのように構成しますか?

サービスの1つ(または複数)でエラーが発生し、Failoverclustermanagerによって再起動された場合はどうなりますか?この場合、このサービスは、他のサービスから「I'mReadyforWork」メッセージの1つを再度受信することはありません。

他のノードにフェイルオーバーすると、すべてのサービスがこれらのメッセージを再度送信し、その結果、すべてが正常に機能するようになると思います。

この動作をテストするには、次のようにします。

  1. すべてのサービスを停止して再起動します。
  2. 1つのサービスのみを停止します。
  3. 停止したサービスを再起動します。
  4. システムがハングしない場合は、各サービスでこれを繰り返します。

システムが再びハングする場合は、構成を確認してください。このシナリオでは、すべてではないにしても、少なくとも1つのサービスが再起動の間にサブスクリプションを失います。まだ行っていない場合は、サブスクリプションをデータベースに保持します。

于 2010-10-13T15:20:00.047 に答える