2013-02-20 72 views
1

我有一個服務器多個客戶端服務器 - 在接收到來自客戶端的消息後,服務器需要處理它,然後再傳遞給另一個客戶端。在哈希表或矢量向量中存儲隊列

我不知道什麼是我想要做的最好的實現,所以將不勝感激任何幫助。這些消息將以一定的時間間隔發送,所以消息需要被接收,處理並推入到一個結構中,然後才能在某個特定時間從要發送的結構進行訪問。該消息有兩個屬性:目標和優先級。訪問將以具有兩種模式的時間間隔執行:或者特定於客戶端節點,或者對所有節點開放以進行接收。

  1. 如果時間間隔只允許一個特定的節點接收,會發生什麼情況是所有的隊列被從最高優先級檢查以最低即,從結構中的最高優先級發送的最早的消息將被「推」出。
  2. 如果時間間隔是'開放',那麼不管節點的最高優先級的最早的消息將被'推出'。

我首先想到它可能是一個vector<vector<queue<message>>,但我意識到,根據第2點搜索將不會有效。我將不勝感激任何建議!我被告知使用哈希映射,但是我沒有這方面的經驗,如果這是最好的方法去解決這個問題,我會很感激的。

編輯:是一個更好的解決方案,將相同的消息推送到兩個不同的結構?一種:根據優先級分類,向量持有FIFO隊列(每個優先級一個)。二:根據節點對其進行分類,vector<vector<queue<message>>

+0

爲了澄清,每個消息總是註定*一個*節點?此外,節點的可能數量是多少(至少是非常粗略的範圍:幾十,幾百,幾千)? – 2013-02-21 18:05:14

+0

@Darius消息最初只能發往一個節點(隨後可能會實現廣播)。節點的可能數量將從幾十到幾百。對不起,沒有說清楚! – sccs 2013-02-22 01:31:02

回答

1

HThere沒有人回答這個,除非你有一個大小和速度的想法。所以,我想我會放下一些我想出來的選擇。

選項1 - 超級計算機:假設我們假設一臺超級快速的機器,與所涉及的數據量相比。我們可以簡單地將消息存儲在無序列表中,因爲它每次都會快速地遍歷列表(平均而言,我們需要遍歷列表的一半)。

選項1A - 讓我們來打擾一下:按優先級+到達時間排序的列表會快速地使「開放」響應快,因爲我們只是從「頂部」取出。對於特定節點的響應,我們通常會尋找遠少於一半,因爲首要任務都是在開始部分

選項2 - 低資源,百節點,數百封郵件:如果插入時間到數據結構並不那麼重要,並且當您需要發送消息時,您只需要儘可能短的響應,然後您需要一個全局隊列,以便在間隔打開時可以彈出。您還需要節點特定的隊列。最後,您需要一種方式來即時訪問特定於節點的隊列。這意味着:

  1. 全球有序列表
  2. 器N節點特定的有序列表
  3. 地圖由節點ID鍵,並指向特定的節點列表

依我之見,痛苦的部分將是同步,以便每次從全局和特定於節點的列表中刪除(同時添加)

我的第一個想法是將每個消息包裝在一個充當節點的包裝中一個雙鏈表。但是,它實際上是兩個列表。包裝將基於全局優先級具有Prev和Next;但是,它也會根據節點特定的優先級具有Prev和Next。這樣,你只有一個消息本身的副本,而你以一種標準的方式固定prev/next指針。 (這基本上結合了上面的#1和#2)。

對於#3,我會保留一個映射,但不是查找特定於節點的列表,而是指向該特定節點的「頭」包裝。

這裏有一張圖片來說明。 Double Duty, doubly-linked list

這聽起來很有趣!

+0

天哪,太棒了! – sccs 2013-02-25 02:57:49