ZeroMQ N-to-N pub/sub モデルを活用した POC を構築しています。アプリ サーバーから http リクエストが処理されたときに、スレッドがデータベースからデータをプルすると、ローカルの memcache インスタンスがそのデータで更新されます。アプリ サーバー クラスター内の他の memcache インスタンスを同期するために、リクエスト スレッドはZMQ パブリッシャーを使用してデータを含むメッセージを送信します...したがって、問題は次のとおりです。メッセージを送信するためにソケットに依存する多くのスレッドがありますか? ソケットのプールを共有しますか? スレッドごとにソケットを作成/破棄しますか?
戦略 1 - スレッド管理のパブリッシャ ソケット
このアプローチでは、各スレッドT1
、、、T2
およびT3
が、ソケット オブジェクト (パブリッシャ) の作成、接続の確立、メッセージの送信、および最後にソケットのクローズによって、ソケット オブジェクトのライフサイクルを管理します。thisに基づいて、これは確かに最も安全なアプローチですが、ソケットの作成、接続、および破棄を繰り返す場合のオーバーヘッドに関して懸念があります。オーバーヘッドがパフォーマンスに悪影響を及ぼす場合は、回避したいと考えています。
戦略 2 - パブリッシャー ソケット オブジェクト プール
このアプローチでは、親プロセス (アプリ サーバー) が起動時に ZMQ パブリッシャーのプールを初期化します。スレッドがパブリッシャーを必要とする場合、オブジェクト プールからパブリッシャーを取得し、メッセージを送信してから、パブリッシャーをプールに返します。パブリッシャーを使用するスレッドに関しては、ソケットの作成、接続、および破棄のプロセスは排除されますが、プールへのアクセスは同期され、同じパブリッシャー オブジェクトを同時に使用する 2 つのスレッドを回避します。発生する可能性があります。
最初に SO テストでリトマス試験を行いたかったため、どちらのアプローチもプロファイルしていません。ボリュームに関しては、アプリケーションは「重い」パブリッシュではありませんが、メッセージをパブリッシュする必要があると同時に、(アプリ サーバーごとに) 100 ~ 150 のスレッドが存在する可能性があります。
繰り返しになりますが、メッセージの送信をパブリッシャに依存するスレッドがアプリケーションに多数ある場合、パフォーマンスを重視しながらオーバーヘッドを最小限に抑えるには、どの戦略が最も効果的でしょうか?