2012-06-28 126 views
5

方案: 我們有多個節點分佈在地理上,我們希望隊列爲該位置收集消息。然後,我們希望將收集到的每個節點中每個隊列的數據發送到中心位置的相應隊列。在中央節點中,我們將提取隊列中收集的數據(從其他節點),處理並持久存儲。將一個隊列實例與多個Redis實例同步

約束:

  • 數據對我們來說非常重要。因此,我們必須確保在任何情況下我們都不會丟失數據。
  • 因此,我們需要在每個節點上進行持久隊列,以便即使節點出於某種隨機原因而關閉,但當我們將它提出時,我們已經收集到的數據與我們保持一致,並且可以將它發送到它可以被處理。
  • 同樣,如果中心節點發生故障,數據必須保留在所有其他節點上,這樣當中心節點出現時,我們可以將所有數據發送到中心節點進行處理。
  • 此外,中央節點上的數據不得重複或存儲。也就是說,在其中一個節點上收集的數據應該只存儲在中央節點上一次。
  • 我們收集的數據對我們來說非常重要,數據傳輸到中央節點的順序不是問題。

我們的解決方案 我們已經考慮了幾個外面我要名單下跌,我們認爲是最好的一個解決方案。一個可能的解決方案(我們認爲)是使用Redis來維護各處的隊列,因爲Redis提供了持久存儲。然後可能有一個守護進程在所有地理上分離的節點上運行,這些節點從隊列中讀取數據並將其發送到中央節點。接收數據的中央節點向其接收數據的節點發送ACK(因爲數據對我們來說非常重要),然後在接收到ACK時,節點將從隊列中刪除數據。當然,會有超時時間,其中必須收到ACK。

的問題 將上述溶液(根據我們)將正常工作,但問題是,我們不希望由我們自己來實現整個同步協議,原因很簡單,我們可能是錯在這裏。我們無法在Redis中找到這種特殊的同步方式。因此,我們對其他基於AMQP的隊列開放,如RabbitMQ,ZeroMQ等。我們再次無法弄清楚我們是否可以用這些解決方案來做到這一點。

  • 這些消息隊列或任何其他數據存儲是否提供可以解決我們問題的功能?如果是,那麼如何?
  • 如果不是,那麼我們的解決方案是否足夠好?
  • 任何人都可以提出更好的解決方案嗎?
  • 有沒有更好的方法來做到這一點?
  • 什麼是最安全的方法?
  • 我們收集的數據對我們來說非常重要,數據傳輸到中央節點的順序不是問題。

回答

4

您可以通過設置中心節點(或節點集羣)作爲來自其他節點的消息使用者並使用消息確認功能來完成此任務。此功能意味着中央節點可以確認傳送,以便其他節點只在確認後刪除消息。請參閱:http://www.rabbitmq.com/tutorials/tutorial-two-python.html

如果您還有其他問題,請發送郵件列表rabbitmq-discuss。

+0

爲正確的工作使用正確的工具:當您需要確認,持久性和(高級)消息路由時,RabbitMQ絕對是正確的工具。 「 – FGRibreau

+0

」此外,中央節點上的數據不能重複存儲,也就是說,其中一個節點上收集的數據只能存儲在中央節點上一次。「我如何確保這一點?考慮到由於網絡問題(在我們的場景中)ACK沒有得到交付。在這種情況下會發生什麼?隊列仍然不知道工作完成的狀態。在這種情況下的消息是否被鎖定?或者另一名工作人員拿起它?如果另一個工作人員拿起它,那麼我們將有相同的數據工作兩次,對嗎? – vaidik