2012-04-23 70 views
4

我有一個服務器,它維護應用程序的全局狀態。Pub/sub,同時保持訪問系統的完整狀態

客戶端可以連接到服務器並獲取有關全局狀態更改的消息(發佈/訂閱機制以便服務器廣播信息)。

但是,在啓動時,客戶端根本沒有關於全局狀態的信息,他們需要它。我想要的是任何新客戶訂閱系統,第一個通知消息是應用程序的完整狀態。然後,他們只收到關於此狀態變化:

  1. 客戶端連接到郵件系統
  2. 它簽約的消息系統
  3. 它得到的第一個消息是系統的全狀態
  4. 然後,它只收到關於全局狀態的變化

這個想法類似於多人遊戲,其中新玩家必須首先獲得完整的遊戲狀態,然後只發送遊戲中的更改。

像ActiveMQ或Stomp這樣的消息傳遞系統可以滿足我的需求,因爲它們是多語言的,可以與多個傳輸層一起使用。然而,沒有這種發送完整狀態的概念(或以連貫的方式累積最後的變化)。當然,我可以很容易地以靜態的方式提供這個狀態(首先我得到完整的狀態,然後我訂閱發佈/訂閱系統),但是我必須小心在此期間可能發生的變化(沒有我在處理完整狀態時會失去一些更改嗎?這種更改是否已在我剛剛檢索的全局狀態中考慮到?...)。但是,我失去了Stomp和ActiveMQ已經提供的多語言/多傳輸方面的功能。

是否有一些現有的庫/工具可以做到這一點? ActiveMQ的某種擴展?類似Stomp的東西?還是需要手工製作?

回答

2

這不是一個消息傳遞域問題,而是一個特定的用例。 Pub/Sub的目的不是要了解有關生產者/消費者的任何狀態信息,它只是代理消息。

也就是說,有幾種不同的重新交付模式可以用來彌補差距(Last Image Subscription Policy等),但我會選擇更簡單的解決方案。此外,您可能會考慮使用像Apache Camel這樣的產品和訂戶之間提供這種額外的邏輯..

正如您所說,棘手的部分是保持增量更新與檢索到的完整系統映像同步。在頂部,這是我會做的...

  • 提供REST服務,允許任何客戶端拉動系統
  • 添加一個遞增的版本號都滿狀態數據和增量更新數據
  • 的全部狀態,當客戶端上線
    • 訂閱開始得到增量更新(內部排隊它們現在)
    • 使用REST服務,以獲得完整的系統狀態
    • 然後,開始處理INC remental更新和無視舊的基礎上,版本號
+0

是啊,這也是我會在默認情況下做的。爲了以防萬一,我還在其他幾天等待其他答案。 – 2012-04-23 19:13:31

+0

酷...我很好奇,如果有人知道更清潔的方法以及...好問題 – 2012-04-24 15:14:07

相關問題