NServiceBusまたはMassTransitを使用したサービスバスのフェイルオーバーシナリオ
-
01-10-2019 - |
質問
MicrosoftのようなIDサーバーを構築する必要があります http://login.live.com.
フェールオーバーを処理するには、複数のWebサーバーノードがあります。計画は、すべてのデータベース書き込み操作がデータベースサーバーにメッセージを送信することによって行われることです。データベースはミラーリングまたは複製されます。アイデアは、データベースが書き込み操作を購読するが、他のノードも購読するということです。そうすれば、他のノードはデータベースから読み取る必要がなく、キャッシュを更新できます。
私はサービスバスアーキテクチャを学び始めたばかりで、私にとって明確ではないのは、サービスバスのフェイルオーバーシナリオを処理する方法です。
質問:
- データベースサーバーが利用できない場合、公開されたメッセージで何が起こりますか?
- それらはどこかに保管されますか?
- サービスバスのフェイルオーバーを処理するために追加のマシンまたはクラスターが必要ですか?
- SQL Serverはメッセージストアとして使用できるが、耐久性のあるMSMQを使用できますか?私はそれらをデータベースに書き込むことができるようにメッセージを列に並べているので、なぜそれらを取得して再び書くために最初にそれらを最初にDBに保存するのですか?または、私はこれを間違えており、DBはメッセージではなく、サブスクリプションのリストにのみ使用されますか?
解決
これはセットアップの方法に依存しますが、MassTransitでは、サブスクリプションをアクティブにしておくことができるため、メッセージは引き続きDBのキューに配信されます。 DBが再びアクティブになったら、キューのメッセージを読むことができます。
MassTransitのサービスバスに接続された各サービスには、それ自体がアクティブなキューがあります。メッセージはそこに保存されます。
これは「依存する」と思います... MassTransitはMSMQよりも他のMQをサポートしていますが、MSMQを中心に構築されています。 MSMQからのフェイルオーバーなど、私たちは大きなサポートを経験していません。ただし、サブスクリプションサービス(つまりバス)が失敗した場合、すべてが障害なく実行され続けます - サービスはすでに誰と話すかをすでに知っています。これが問題になるのは、消費者(購読または登録解除)の変更です。私にとって、それはほとんど起こらないイベントです。
MassTransitを使用すると、DBを使用してサブスクリプション状態を保存しますが、すべてのメッセージはMSMQに保存されます。
これらの回答のいずれかで詳細が必要な場合、またはMTに関する追加の質問がある場合は、メーリングリストにご参加ください。 http://groups.google.com/group/masstransit-discuss.
他のヒント
この種のアーキテクチャを実装すると、CQRSの原則を適用することを検討する必要があります - クエリ(このユーザー/PWDコンボ有効です)は、バスを介して行うべきではありません。コマンド(PWDの変更、PWDを忘れた)は、イベントとして公開されていないバスを介して送信されます。内部的には、イベントを使用してコマンドとクエリの側面を同期させる可能性がありますが、これにはクライアントが含まれません。
クエリは、DBの複製された読み取りスレーブに対して単純なADO.NETを使用して実行できます - CQRSの永続的ビューモデルとして知られています。必要に応じて、その前に簡単なWCFを置くことができます。
MSMQを使用する場合、すべてのメッセージはストアアンドフォワードを介して配信されます。つまり、サーバーに配信される前にクライアントに最初に保存されるため、サーバーがダウンしている場合、メッセージはクライアントに待機しています。フォールトトレランスのために、メッセージを回復可能にする(ディスクに書き込まれます) - これはNServiceBusではデフォルトですが、標準のMSMQのデフォルトではありません(MassTransitについてはわかりません)。このためにデータベースは必要ありません。
NServiceBusでは、バスは別のマシンに設置されていないため、システムの残りの部分とは無関係にその可用性に対処する必要はありません。コマンド処理をより多くのノードにスケーリングすることを検討したときだけ、NServiceBus(ディストリビューターと呼ばれる)のメッセージベースのロードバランサーを使用することを検討する場合があります。