2014-05-18 198 views
1

的情況是發佈/訂閱,而我尋找一個解決方案,可以給發送由一個生產者多個消費者實時生成一個消息的可行性。這種情況下的輕量級可以通過一種解決方案來處理,效果更好!哪種解決方案把手發佈/訂閱方案更好?

在AMQP服務器的情況下,我只檢出了Rabbitmq併爲pub/sub模式使用rabbitmq服務器,每個消費者應該聲明一個匿名的私有隊列並將其綁定到扇出交換機,以防萬一用戶實時消息將有成千上萬個由rabbitmq進行的匿名隊列處理。

但我真的不被RabbitMQ的喜歡的方式,這將是理想的,如果RabbitMQ的可能處理這個的pub/sub場景,其中一個隊列,一個消息,很多消費者監聽一個隊列!

我想問的是,哪種AMQP服務器或其他類型的解決方案(包括XMPP服務器或Apache Kafka或類似的任何類似解決方案)更好地處理pub/sub模式/場景,並且比RabbitMQ處理效率更高當然)更少的服務器資源?

偏好的利益秩序:

  1. 在AMQP啓動服務器的情況下處理的pub/sub場景中,只有一個或更少的隊列號(解釋)

  2. 處理成千上萬的消費者輕量級方式,與pub/sub模式中的其他解決方案相比消耗更少的服務器資源

  3. 羣集,容忍節點失敗

  4. 許多語言綁定(Python和Java至少)

  5. 易於使用和管理

我知道我的問題可能很一般,但我喜歡聽到酒吧的想法和建議/子情況。

謝謝。

回答

1

一般來說,對於RabbitMQ,如果你把用戶routing key,你應該能夠使用單個exchange然後少數queue S(甚至是單個的,如果你想要的,但你可以如果您的設置有意義,請將它們分爲服務器或類似設備)。

如果你不需要guaranteed order(比如說保證FK約束不會碰到各種SQL數據庫表的一系列更改),那麼沒有理由你不能擁有一個的consumers一束從一個單一的隊列繪圖。

如果你想場景的廣播消息類型,那麼也許可以不同的方式處理了一下。相反,在routing key單用戶,你可以使用非廣播型的消息,有一個特殊的用戶類型,比如說,__broadcast__,沒有用戶實際上可以有,而且有用戶播放存儲在消息的有效載荷以及消息本身。

然後,您的消息處理代碼可以負責在所有這些用戶中將該消息存放在數據庫(或任何最終目的地)中。響應

編輯從OP評論:

所以routing key可能是這個樣子消息[用戶]其中[用戶]可能是實際的用戶,如果它是一個點對點點訊息,以及特殊的用戶(或者實際用戶不被允許註冊的類似用戶名),這將指示廣播風格消息。

然後,您可以將消息應該發送到的用戶放在消息的​​中,然後可以將該消息內容(也將在​​中)遞送給每個用戶。這樣做的機制取決於你的最終目的地是什麼。即消息是否最終存儲在PostgresMongo DB或類似的地方?

+0

你能更準確嗎?把用戶放在路由鍵中是什麼意思?我沒有得到它與交換和少量隊列的關係。如果你能解釋更多的話,我們將非常感激。如前所述,場景是通過單個隊列向所有消費者發送一條消息,確保所有消費者都能收到該消息的副本,然後再收到消息。如果你能指出任何類型的文件,那也可以。 順便謝謝你的回答:) – NOVIA

+0

以上澄清;還有關於消息的最終目的地是什麼的問題。 – khampson