2012-03-27 47 views
-1

網絡協議解析器代碼,解析單線程中的圖層。解析一些網絡協議後,得到唯一的對話框。 對於網絡協議解析器項目;有一個消息解析器,解析具有多個層的消息(例如,以太網,IP,TCP等)。解析字段之一是層中間的對話ID;這意味着在獲得它之前需要進行一些解析操作。得到dialog id解析後應該(因爲性能)多線程。 約束是指具有相同對話ID的消息應以相同的順序處理。我有一些想法,但不確定是否優雅。按參數排列的Java Multithread

  1. 創建10個隊列作爲對話框ID的最後一位,每個隊列解析單獨的線程。
  2. 多個執行程序的模塊操作相對於對話框id類似的第一個選項。

如何將消息處理爲多線程?

更多解釋; 有多於一個的消息相同的對話ID和它應處理相同order.These被對話ID之間沒有相關性,我的意思是對話ID = 100能夠對話ID之前處理= 99

消息

例傳入訂單

  1. 對話ID = 100
  2. 對話ID = 99
  3. 對話ID = 98
  4. 對話ID = 100
  5. 對話ID = 100
  6. 消息2或消息4 - - 消息1.後消息5之前沒有消息4之間的任何順序
  7. 對話ID = 98
  8. 對話ID = 99

消息4應處理消息3等。

+1

找不到問號。 – bezmax 2012-03-27 09:53:59

+0

我猜只是最後一點是真正的問題,而且你問:「配置我的有效載荷的最佳方法是按順序處理具有相同對話ID的所有項目?」根據定義,「不具有相同對話ID的項目可以按任何順序處理」 - 即可以與具有dialogId = 1002的項目同時處理項目dialogId = 1001? – wmorrison365 2012-03-27 09:56:39

+0

如果上述條件爲真,那麼:(1)我假定「按順序」的意思是說,一旦有效載荷項被解析器識別出來,它必須在由具有相同對話的解析器識別的下一個項之前被處理ID。即對於dialogId = 1001,解析器找到了項目1001_1,然後是1001_2,然後是1001_3,因此應按照該順序處理這些項目。如果是這樣,(2)處理每個項目的結果是否按照該順序保持是重要的,還是按照該順序完成實際的「處理」是足夠的? – wmorrison365 2012-03-27 09:59:22

回答

0

好吧,給你的編輯和我在評論這個問題的假設,我可能會做以下的(我認爲這是接近你是無論如何提示)。請注意,我假設處理的順序很重要,但不是所產生的任何結果的順序(因爲您需要在每個有效負載項上使用順序ID)。

我建議如下:

  1. 使用基於隊列的機制,確保 項目具有相同對話ID的執行順序。這可能是併發的 隊列實施或JMS隊列,具體取決於系統的分佈 。
  2. 決定你需要隊列的數量,給您的總有效載荷。
  3. 所有具有相同dialogId的項目都必須進入同一隊列。多個 不同的dialogIds可以進入同一隊列。
  4. 確定哪個隊列一個dialogId應該被分配到使用id的散列 或模。通過這種方式,您的隊列將始終包含 有效負載項目,以實現dialogId。
  5. 或者:

    (一)杭多個工作線程關閉每個隊列來同時處理的物品,在 序列從隊列。這提供了最高併發(硬件的 範圍內),但你運行的兩個項目具有相同 對話ID的風險正在開始訂單,但出完的順序(即1001_1開始 第一,但睡覺和1001_2啓動,在那段時間內完成)。

    (b)中僅杭一個worker線程每個隊列來處理在一個時間 嚴格的順序一個從該隊列項目。您現在削減線程的數量每個隊列下降到 只有一個,但是,這樣做,你能保證處理該隊列 (並在其上處理所有dialogIds)的順序。 (c)作爲(b)但每個對話ID有一個線程(對於在該隊列上處理的所有ID,該隊列可以向前看並且只處理具有該ID的線程,這保證了 命令並且提高了吞吐量(d)由於(a)有多個線程可以跨所有ID操作,但會鎖定對話框ID ,以確保按順序完成處理。管理要做什麼的大量開銷 對話ID被鎖定 - 開始新隊列?requeue?

在任何情況下,您總是可以每個隊列至少有一個線程,並且對於您的設置而言,最多可以有多個隊列。這樣你可以實現一些併發性。此外,越是可以將隊列中的對話ID傳播越好。其他考慮因素是負載平衡隊列。

0

您將需要跟蹤您當前處理的任何消息的對話ID,因爲您無法開始處理具有相同對話ID的其他消息,直到前一個消息完成。

所以我會推薦以下內容:將數據包存儲在列表中。主列表包含每個對話ID至少有一個未處理消息的條目。內部列表包含當前對該對話ID未處理(或未完整處理)的所有消息。

當您收到新消息時:檢查當前處理消息的表。如果有一個具有相同的對話ID,請將該消息鏈接在它後面。如果沒有,則使用該對話框ID在表格中創建一個新條目。將其標記爲可以處理並喚醒任何睡眠線程。

處理消息:檢查當前處理消息的表格。如果沒有標記就緒,請等到一個標記就緒。如果您發現一個標記就緒,請從該內部列表中獲取頭部消息,並將該列表標記爲正在處理中。完成處理後,如果沒有消息鏈接到它(使用相同的對話ID0,請將其從主列表中刪除,否則,請刪除我們已處理的消息並將其標記爲可以處理。