バス インスタンスのライフサイクルとベスト プラクティス [終了]

StackOverflow https://stackoverflow.com//questions/25046992

  •  21-12-2019
  •  | 
  •  

質問

キュー メカニズム全般、特に Rebus を評価しているときに、バス インスタンスのライフサイクルに関して次のような疑問が生じました。

  1. Windows サービスでホストされている複数の WCF サービスからバス インスタンス (一方向クライアント モード) にアクセスする必要がある場合、インスタンス化の唯一のオプションはシングルトン モードですか?

  2. バスを一時停止して (メッセージ ハンドラーへのメッセージのディスパッチを停止しますか?)、バスを再度開始する方法があります。または、バスを破棄して新しいバスを作成するしか方法はありません。

    • このユースケースは、スループット制限または時間あたりのトランザクション制限があるシステムに接続する場合です。
  3. サガには複数のワーカーを含めることができます。そうであれば、イベントが正しい順序 (イニシエーターが最初) で送信されたと仮定すると、次のイベントが処理される前に、サーガを作成するためにイニシエーターが最初に処理されることを保証する方法があります。複数の労働者と一緒ですか?

  4. 同じホスト内の場合、複数のバス インスタンスが使用され、メッセージ ハンドラー内で、同じ構成に基づいて別のバス インスタンスで send を呼び出します。相関IDも送信されず、返信などもうまくいきませんよね?

Rebus がこれをどのようにサポートするかどうかについて、コードのリファレンス/例を使用して具体的に回答することを好みます。

役に立ちましたか?

解決

1:とてもシンプルです:バス インスタンス (つまり、の実装 IBus それはコンテナに入れられ、あなたが行うときに手渡されます。 Configure.With(...) 構成スペル) は、アプリケーションの存続期間全体にわたって維持されるシングルトン インスタンスであると想定されています。

複数のインスタンスを簡単に作成できますが、それは同じプロセス内で複数の Rebus エンドポイントをホストする場合にのみ役立ちます。

IOW バスは完全にリエントラントであり、Web アプリケーション内のスレッド間で安全に共有できます。

2:すぐには無理です、いいえ、少なくともパブリック API でサポートされている方法では無理です。あなた できる ただしこれを実行します: ((RebusBus)bus).SetNumberOfWorkers(0) (すなわち、キャストする IBus インスタンスへ RebusBus ワーカー スレッドの数を変更します)。これは、ワーカーの数が目的の数に調整されるまでブロックされます。

このようにして、実際に望んでいることを達成することができます。これは (まだ) Rebus の公式機能ではありませんが、将来的には登場する可能性があります。ただし、実行時にワーカーの数を調整する機能がなくなるわけではないことは保証できます。

3:はい、どの永続層を選択しても、サガはオプティミスティック同時実行スキームによって保護されます。どのタイプのメッセージが最初にサガに到着するかわからない場合は、サガをこれに耐えられるようにする必要があります。ただ実装するだけ IAmInitiatedBy<> 開始する可能性のあるメッセージ タイプごとに、それを適切に処理するように設定します。

順序が崩れたメッセージに対して (かなり) 耐性があることは、一般的な堅牢性の原則であり、メッセージがエラー キュー内にしばらく留まった後に再配信される場合にも役立ちます。

4:Rebus は、複数のバス インスタンスを使用している場合でも、現在のメッセージ コンテキストを取得します。 「アンビエントコンテキスト」 (すなわち、ある MessageContext これにより、処理されたメッセージの相関 ID がすべての送信メッセージにコピーされます。

したがって bus.Reply も機能します。

ただし、(1) で述べたように、バス インスタンスは完全にリエントラントであるため、実際に論理的に異なるエンドポイントでない限り、複数のインスタンスを配置する必要はありません。

これであなたの質問が解決されることを願っています:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top