2017-07-24 48 views
0

考慮一個羣組聊天場景,其中4個客戶端連接到交換機上的主題。這些客戶端向主題發送接收消息,因此它們都發送/接收來自該主題的消息。從開頭讀取所有消息

現在想象一下第5個客戶端進來並想要讀取從時間開始發送的所有內容(因爲該主題是第一個創建並連接的)。

RabbitMQ中是否有內置功能支持此功能?

非常感謝,

編輯:

爲了澄清,我真正問的是RabbitMQ是否支持SOW,因爲我無法找到它的任何地方的單證(http://devnull.crankuptheamps.com/documentation/html/develop/configuration/html/chapters/sow.html)。

回答

1

你想要做的不是RabbitMQ的正確用法。消息隊列是而不是數據庫。它們不是長期持久性解決方案,就像RDBMS一樣。您可以主要使用RabbitMQ作爲緩衝區來處理傳入的消息,消費者處理它後,插入到數據庫中。當新客戶端連接到您的服務時,數據庫將被讀取,而不是消息隊列。

Relevant

而且,除非你正在建設一個非常大的,高度可擴展的系統,我懷疑你真正需要的RabbitMQ。

+0

在所有的應有的尊重,這是不正確的。許多隊列實現支持SOW(例如,參見http://devnull.crankuptheamps.com/documentation/html/develop/configuration/html/chapters/sow.html)。我在問兔子是否實現了這種功能,因爲我在文檔中找不到任何東西。 – kha

+0

我對SOW瞭解不多,但我不認爲許多MQ實現它。通常,它們不被用作數據庫,我們有RDBS。我建議你在這裏使用RabbitMQ的郵件列表:http://www.rabbitmq.com/contact.html – appl3r

1

具體而言,問題是:有沒有辦法讓RabbitMQ輸出在新用戶加入時已發送給主題的所有消息?

簡短的回答是沒有。

長答案是也許。如果預先了解所有潛在的「參與者」,則可以預先設置和配置參與者隊列,訂閱該主題,並在服務器運行時收集發佈到該主題的所有消息(匹配路由密鑰)。其他服務器配置可以產生在服務器重新啓動時持續存在的隊列。

請注意,所描述的原始問題/功能請求與RabbitMQ的體系結構不一致。 RabbitMQ應該是一個瞬時存儲節點,客戶端隨機連接和斷開連接。轉儲到隊列中的消息只能由一個消息使用者處理,一旦處理完畢,消息代理的工作就是忘記消息。

另一種實現這種功能的方法是創建一個審計隊列,其中所有已發佈的消息都分發到隊列中,並且寫入器服務將它們全部寫入某處的審計日誌中(通常在持久數據存儲或文本中文件)。由於目前沒有插件可自動將消息發送到持久性存儲設備(例如,Couchbase,Elasticsearch),因此您需要構建這些內容。

或者,如果用作調試工具,則有Firehose插件。如果您能夠手動啓用/禁用它,這是令人滿意的,但這不是一個好的長期解決方案,因爲它會在代理中斷時自行關閉。

+0

謝謝!我確實找到了這個插件(https://github.com/rabbitmq/rabbitmq-recent-history-exchange),它或多或少的或多或少地在我這裏問了一些問題,但並不完全符合我的預期。這個問題更多的是一個理論問題,因爲我想知道'RabbitMQ'是否支持'SOW'查詢,顯然它不支持。許多高級隊列(大部分不是免費的)都支持此功能,並且它非常有用,因爲您不必依賴其他機制來臨時存儲臨時數據,但這不僅僅是重點。非常感謝您的答覆。這非常有幫助。 – kha

+0

很高興能幫到你!關於你評論的第二部分 - 添加產品以處理這種情況將是相當微不足道的。我不得不相信這比購買一些東西更具成本效益,尤其是因爲大多數支付郵件經紀人的表現比RMQ差得多。 – theMayer