2009-07-16 177 views
8

對於不一致支持優先級消息(如AMQP)的面向消息的中間件,當隊列只有FIFO語義時,實現優先級消耗的最佳方式是什麼?一般用例是一個系統,當隊列中存在大量消息時,消費者在優先級較低的消息之前接收較高優先級的消息。在FIFO Qeueing系統中,實現優先消息的最佳方式是什麼

+2

你有多個隊列嗎?如果是這樣,我會建議有一個高優先級消息的單獨隊列,這是在標準隊列之前首先被查詢的,這隻有在優先級隊列是空的時才被使用。我不知道這是否符合你的情況,但這是我的第一個想法。 – CodeFusionMobile 2009-07-16 17:58:42

+0

我同意CSharpWithJava。我目前在做一個大的即時通訊應用,我想從你的問題,你需要多個隊列,這樣你就可以卸載低優先級的消息,以較低的優先級隊列,並立即讀取高優先級。 – 2009-09-30 17:39:46

回答

10

只給定一個給定的單個隊列的FIFO支持,您當然必須引入多個隊列,一箇中介,或者擁有更復雜的消費者。

多個隊列可以通過幾種方式處理。生產者和消費者可以同意在他們之間有兩個隊列,一個用於高優先級,另一個用於後臺任務。

如果您的生產者僅限於一個隊列,但您可以控制消費者,請考慮在路徑中引入扇出路由器。所以生產者 - >路由器是一個單一的隊列,然後路由器有兩個隊列給消費者。

另一種方法來解決它,這很可能不太理想,將有你的消費旋轉一個線程來前的隊列,然後派遣工作內部。就像上面的路由器版本,但在一個應用程序內。這具有在應用程序中運行多個消息的缺點,這可能會使發生故障時的恢復複雜化。

不要忘記考慮有效的低優先級的事件,無論他們是飢餓,如果他們中的一些應即使仍有閒逛更高優先級的事件進行處理。

相關問題