1

私はサーバー(複数のクライアントサーバー)を持っています。クライアントからメッセージを受信すると、サーバーはそれを処理してから、別のクライアントに渡す必要があります。

自分がやりたいことに対して最適な実装が何であるかわからないので、助けていただければ幸いです。これらのメッセージは時間間隔で送信されるため、特定の時間に送信される構造からアクセスされる前に、メッセージを受信して​​処理し、構造にプッシュする必要があります。メッセージには、宛先と優先度の2つの属性があります。アクセスは、クライアントノードに固有のモードと受信用にすべてのノードに開かれたモードの2つのモードがある時間間隔で実行されます。

  1. 時間間隔で特定のノードのみが受信できる場合、すべてのキューが最高の優先度から最低の優先度までチェックされます。つまり、最高の優先度で送信された最も早いメッセージが構造から「プッシュ」されます。
  2. 時間間隔が「オープン」の場合、ノードに関係なく、最も優先度の高い最も早いメッセージが「プッシュ」されます。

と思ったのですがvector<vector<queue<message>>、ポイント2で検索するのは効率的ではないことに気づきました。アドバイスをいただければ幸いです。ハッシュマップの使用についてアドバイスを受けましたが、これについての経験はありません。これが最善の方法である場合は、アドバイスをいただければ幸いです。

編集:同じメッセージを2つの異なる構造にプッシュするためのより良い解決策はありますか?1つ:優先度レベルに従って分類し、FIFOキューを保持するベクトル(優先度レベルごとに1つ)。2:ノードに従って分類しますvector<vector<queue<message>>

4

1 に答える 1

1

サイズと速度を把握していない限り、これに対する答えはありません。そこで、思いついたいくつかのオプションを書き留めておこうと思いました。

オプション 1 -- スーパー コンピューター:関連するデータの量と比較して、超高速のマシンを想定するとします。毎回リストを実行するのに十分な速度であるため、メッセージを順序付けられていないリストに単純に格納できます (平均すると、リストの半分を実行する必要があります)。

オプション 1A -- ちょっと気をつけてみましょう: 優先順位 + 到着時間で並べられたリストは、「トップ」から取得するだけなので、「オープン」応答を高速にします。ノード固有の応答の場合、最優先事項はすべて最初に近いため、通常は半分以下を検索します。

オプション 2 -- 低リソース、100 個のノード、数百個のメッセージ:データ構造への挿入時間がそれほど重要ではなく、メッセージを送信する必要があるときにできるだけ短い応答が必要な場合は、間隔が開いているときにポップできるように、グローバルキューが必要です。ノード固有のキューも必要です。最後に、ノード固有のキューに瞬時にアクセスする方法が必要です。これは次のことを意味します。

  1. グローバル順序リスト
  2. N ノード固有の順序付きリスト
  3. Node-Id をキーとし、ノード固有のリストを指すマップ

私が見ているように、面倒な部分は、グローバルリストとノード固有のリストの両方から毎回削除するように同期することです(追加中も同じです)

私が最初に考えたのは、双方向にリンクされたリストのノードのように機能するラッパーで各メッセージをラップすることです。ただし、実際には 2 つのリストになります。ラッパーには、グローバル優先度に基づいて Prev と Next があります。ただし、ノード固有の優先度に基づいて Prev と Next も含まれます。そうすれば、標準的な方法で前/次のポインターを修正しながら、取り出すメッセージ自体のコピーが 1 つだけになります。(これは基本的に上記の #1 と #2 を組み合わせたものです)。

#3 については、マップを保持しますが、ノード固有のリストを検索する代わりに、その特定のノードの「ヘッド」ラッパーを指します。

説明するために、ここに写真があります。 二重義務、二重連結リスト

楽しそう!

于 2013-02-22T04:19:09.793 に答える