メッセージタイプごとに1つのディストリビュータープロセスを構成する必要があるというベストプラクティスとして何度か言及されていますが、その理由についての説明はありません。ディストリビューターの数を増やすと展開が複雑になるので、その背後にある理由を知りたいと思います。私の推測では、特定のメッセージタイプで利用可能なすべてのサブスクライバーがビジー状態の場合、ディストリビューターは1つが解放されるのを待ってスタックし、無料のサブスクライバーを持つ可能性のある他のタイプのメッセージはディストリビューターのワークキューに積み上げられます。これは正確ですか?他の理由はありますか?
2 に答える
確かに、ディストリビューターはワーカーが完了するまでそれ以上の作業を配りません。したがって、ワーカーが特定のメッセージタイプに縛られている場合、他のワーカーは完了するまでそこに座ります。NSBには優先順位の概念がなく、すべてのメッセージが同じように作成されます。ワーカーは特定のメッセージタイプをサブスクライブせず、ディストリビューターから手渡された作業を受け取るだけです。
特定のメッセージタイプが他のメッセージタイプよりも「優先度」がある場合は、独自のディストリビューターが必要です。「優先度」がすべて同じである場合、ワーカーを追加すると、パフォーマンスが特定のポイントまで向上します。これは、操作しているリソースによって異なります。データベースの場合、エンドポイントはCPUバウンドよりもデータバウンドが多い可能性があります。その場合、ワーカーを追加しても、同じリソースで競合が増える可能性があるため、役に立ちません。この場合、何らかの方法でリソースのパーティション化を検討する必要があります。
メッセージタイプごとに1つの論理エンドポイント(論理エンドポイントは、ディストリビューターの背後にある1つのエンドポイントまたはエンドポイントの多数のコピーに等しい)を使用すると、各ユースケースを個別に監視およびスケーリングできる柔軟性が得られます。
また、1つのメッセージタイプのエンドポイントを他のすべてのメッセージタイプから独立してバージョン管理できます。
より多くのプロセスをインストールするという点でデプロイメントの複雑さが増し、最終的には柔軟性と複雑さのバランスをとる必要がありますが、これらのデプロイメントの問題の多くは自動化できることに注意してください。