0

TCP/IP ソケットを使用して複数の宛先に同じメッセージを送信するための最良の方法を探しています。Windows で既存の VS 2010 C++ アプリケーションを使用しています。可能であれば、複雑さの多くがすでに解決されている標準ライブラリ/デザイン パターン アプローチを使用することを望んでいます。

これが私が考えているアプローチの 1 つです。1 つのメイン スレッドがデータベースからメッセージを取得し、それらをある種のスレッド セーフ キューに追加します。アプリケーションには、宛先サーバーへのクライアント ソケット接続ごとに 1 つのスレッドもあります。これらのスレッドはそれぞれ、スレッド セーフ キューから読み取り、tcp/ip ソケットを介してメッセージを送信します。ただし、これよりも優れた/単純な/より堅牢なアプローチがあるかもしれません..

私が気にしなければならない問題は、主にレイテンシです。宛先はどこにでもある可能性があり、1 つのソケット接続と別のソケット接続の間にかなりの遅延が発生する可能性があります。メッセージは、正確な FIFO 順序ですべての宛先に送信される必要があります。

また、1 つの宛先がプライマリ宛先と見なされます。例外なく、すべてのメッセージがこの宛先に到達する必要があります。他の宛先、つまり非プライマリの場合、メッセージは単なるコピーであり、非プライマリの宛先がいくつかのメッセージを受信しなくても、絶対に重要ではありません。任意の時点で、非プライマリ宛先の 1 つがプライマリ宛先になる可能性があります。送信先の 1 つが大幅に遅れている場合、そのスレッドは主要な送信先に追いつく必要がありますが、一部のメッセージはスキップされます。

提案を探しています。これまでの予備調査では、私の状況は、単一のプロデューサーと複数のコンシューマーのパターン、またはおそらく Java のマスターワーカー パターンに似ているようです。

Windows の C++ でこれを実装する必要があり、アプリケーションは既存の定義済みプロトコルを使用して tcp/ip ソケットを使用する必要があります。

どんな助けでも大歓迎です。

4

1 に答える 1

0

データベースへの IO チャネルを飽和させるスレッドと、12 台のサーバーにつながるネットワークへの IO チャネルを飽和させるスレッドの 2 つのスレッドが必要です。複数のネットワーク インターフェイス (これについて考える必要があります) を持っていない限り、複数のスレッドを使用してもより高速に送信することはできません。また、ネットワークを処理する複数のスレッドがないため、それらを同期する必要はありません。

絶対に知っておく必要があるのは select() です。WinSock の場合は、WSAEventSelect/WaitForMultipleObjects も参照してください。基本的に、キューからメッセージを取得し、準備ができたらすべてのクライアントに送信します。select() は、一連のソケットの 1 つがデータを受け入れる準備ができたときに通知するので、データの送信を待つ時間を無駄にしたりブロックしたりすることはありません。考え出す必要があるのは、接続が切断された後に再接続するためのスキーマ、遅れているクライアントにいつメッセージをドロップするかなどです。また、さまざまなターゲットへのスループットが大きく異なる場合は、複数のメッセージを並行して処理することを考える必要があります。それらが小さい (ネットワーク パケットのペイロードよりも小さい) 場合、オーバーヘッドを回避するためにそれらを結合することは理にかなっています。

この簡単な概要が開始の助けになれば幸いです。それ以外の場合は、詳細を詳しく説明できます。

于 2013-02-07T22:45:15.640 に答える