2016-01-06 69 views
1

我的應用程序使用Spring + RabbitMQ。它已經設計了兩個功能,顯示用戶&他的朋友的帖子在主頁&通知功能發生的任何事件。爲應用程序中用戶創建的每個主題創建一個新隊列

對於這兩個功能,我在綁定到交換的rabbitmq配置中預定義了隊列。底層模式是發佈訂閱。

現在我對第三個功能的設計感到困惑。說一個用戶創建一個 一個話題說「萬聖節」& n用戶訂閱它。類似地,n個用戶將創建他們的n個主題&其他用戶將訂閱它以進行更新。這也是一個pubsub模式。

我相信每個單獨的主題都應該創建一個新的隊列。那麼,如何動態地爲應用程序中的用戶創建的每個主題創建一個隊列?或者還有其他方法可以解決這個問題?

下面是應用程序的現有隊列配置。

<!-- Creates a queue for consumers to retrieve messages --> 
<rabbit:queue name="UserPostpublishQueue" durable="true"/> 

<!-- queue for sending notifications to users --> 
<rabbit:queue name="notificationQueue" durable="true"/> 

<!-- Fanout exchange for a pubsub bound to UserPostpublishQueue --> 
<fanout-exchange name="broadcastPosts" durable="true" xmlns="http://www.springframework.org/schema/rabbit"> 
    <bindings> 
     <binding queue="UserPostpublishQueue"/> 
    </bindings> 
</fanout-exchange> 

<!-- Direct exchange for a broadcasting notifications --> 
<rabbit:direct-exchange name="broadcastNotifications" durable="true" xmlns="http://www.springframework.org/schema/rabbit"> 
    <bindings> 
     <binding queue="notificationQueue" key="notifications"/> 
    </bindings> 
</rabbit:direct-exchange> 

回答

2

假設一個用戶創建的話題說:「萬聖節」 & n個用戶訂閱了[...]這也是一個發佈訂閱模式。

雖然這是「發佈」內容,但其他人「訂閱」該內容,這不是pub-sub模式。

pub-sub模式明確地指出「如果有人在籬笆上拋誰,誰在乎誰在聆聽」。 pub-sub模式只是典型事件的一個奇特術語。這就等於有人說「嘿![東西]發生了!」和其他人以某種方式迴應,如果他們覺得有迴應。如果一個特定的人不在那裏聽到事情發生,那麼太糟糕了。他們沒有得到有關事情的通知。這就像是和朋友一起出去玩。如果你的一個朋友不在那裏,那麼當他們決定時,他們不會「待在那裏」。他們已經錯過了機會。

在您的情況下,您正在描述報紙或印刷雜誌。內容正在發佈供其他人使用。訂戶希望將來的文章和報告將在某個時間點發送給他們。如果他們沒有收到他們從雜誌或報紙上承諾的信息,他們會很不高興。當事件發生時,他們不必「親臨現場」。他們在事情發生後得到報告,並且保證(在某種程度上)接收報告。

我相信每個單獨的主題都應該創建一個新的隊列。

這是一個非常糟糕的主意。由於RabbitMQ配置和實例的大小和複雜性,您將很快遇到嚴重的性能問題。如果使用次數超過一次,最終會出現成千上萬的很少使用的隊列。

不過,更糟糕的是,你可能最終會把隊列視爲數據庫。一旦你意識到你無法查詢一個隊列,或者多次閱讀同一條消息,事情就會很快分崩離析。

那麼如何動態地爲應用程序中的用戶創建的每個主題創建隊列?

簡短的回答是:不要。

還是有其他方法可以解決這個問題?

消息隊列是在進程間推送數據的好方法。爲此使用消息傳遞服務。

你想要的是數據庫的設計,讓您跟蹤誰訂閱了什麼內容,等

這一切沿着我寫的東西線以下:

+0

所以,德里克如果我們只保存在數據庫中的一切就不是穿上分貝額外負載,而不是輪詢隊列應用程序將輪詢數據庫添加任何新的數據。我明白隊列不是數據庫。如何將數據存入數據庫併爲最新數據設置一個通用隊列或集中隊列,如果有新帖子,它肯定會推送給用戶,而無需輪詢數據庫。我們可以隨時清除隊列中的舊數據。 – underdog

相關問題