2013-01-14 91 views
0

我設計了當前用於通知對從服務器端(Java)的變更內容的一個JavaScript的Web應用程序的自定義郵件系統的替代品。這種傳統的消息傳遞系統通過使用基於自定義文本的協議和普通Java套接字通過Flash XMLSocket工作。AMQP或XMPP的客戶端通知

替換將被用來不僅由Web應用程序(通過網絡插座,而非Flash),但通過C#編寫過一個額外的桌面客戶端應用程序。

我的要求是:

  • 用戶認證
  • 傳輸加密(SSL/TLS)
  • 雙向信息交換
  • 某種(自動)發佈/訂閱,使用戶只得到消息他們被允許接收基於已建立的方案(以便我們可以使用現有的庫如果可能)
  • 消息交換
  • 集羣能夠服務器組件

此時,消息系統將只用於發佈更新到客戶端。客戶端將對這些消息作出反應,並直接從服務器獲取更多信息(而不是通過消息傳遞系統)。如果這個新的消息傳遞系統成功建立,它可能會被用於未來更高級的用例。一些可能性可能包括用戶聊天,文件交換和遠程控制服務器組件。

我對可行技術進行了一些研究以實現這些要求,我認爲我的選擇歸結爲使用ejabberd(XMPP)或RabbitMQ(AMQP)。根據我的要求,這兩個系統的主要優點和缺點是什麼?我們已經將RabbitMQ用於我們系統基礎架構的其他部分,所以這是我自然而然的選擇。我只是不確定讓客戶端應用程序直接連接到這樣一個關鍵的主要組件是否是一個好主意。儘管通過爲客戶端通知使用不同的RabbitMQ安裝,這可能會得到緩解。

+0

如果您仍在使用Java,那麼J2EE JMS可能是一個選項或SonicMQ。 – Romoku

回答

2

那麼你可以使用這兩種協議來滿足你的需求,xmpp是一個可擴展的協議,所以毫無疑問,你正在尋找的東西都已經存在爲plugin或任何協議的正確術語。然而,包括我在內的一些人可能實際上認爲這是一個缺點,並且會給協議增加額外的複雜性。還有一點需要記住的是,xmpp主要是設計成即時通訊協議。例如發佈/訂閱是xmpp的extension,而不是協議本身的一部分。

話雖這麼說XMPP是由組織,如谷歌,這意味着有使用此協議的一些主要參與者的支持,所以毫無疑問,某些擴展都非常好,寫得很好/深思熟慮。

在你有AMQP,協議幾乎是專門爲你以後設計的另一方面。它得到了摩根大通,思科,瑞士信貸等機構的支持,所以毫無疑問AMQP是一個值得信賴的協議,儘管它的早期版本已經在critized

當談到使用RabbitMQ時,似乎與memory有一些問題,但是我不能說得太多,因爲我只被告知這個問題,並且從來沒有真正去實際解決它甚至不理解它。然而,在不同版本的RMQ上,似乎有相當多的人遇到這種情況。

但是對於我來說,RabbitMQ從來沒有崩潰(嘿,如果erlang是有名的,它是穩定的),它是一個快樂的設置,它很容易在羣集中設置,你可以輕鬆地讓你的隊列鏡像在RMQ的多個實例上,並且通過讓一個或多個實例將消息寫入磁盤,您可以擁有額外的安全層。

所以我會說,去與RabbitMQ和AMQP,我相信這是一個非常適合您的需求的協議,但有人說,xmpp可能可以做的工作就好。

我讀過this book,這是對AMQP和RabbitMQ的一個很好的介紹,但是我發現它缺乏技術方面,它基本上是一個很好的教程。 PS:我覺得我應該誠實地說,我不確定bidirectional message exchange需要什麼,但是如果它意味着發送和接收消息,那麼您在AMQP上也很清楚這一點。 :)

我希望這有助於瞭解哪種協議可供選擇。

編輯

RabbitMQ的有一種叫做virtual hosts這就像一個自己的RabbitMQ實例,所以你不必開始建立一個集羣只是爲了處理不同的責任。根據您設置隊列和交換的方式,我沒有看到連接到RabbitMQ服務器的客戶端存在問題,但集羣毫無疑問是個好主意。似乎用HAProxy設置RabbitMQ是非常容易的,但這又是我沒有經驗的。

+0

謝謝你的回答。那麼讓RabbitMQ對我們的應用程序數據庫進行用戶身份驗證有多容易呢?這是否是一個好主意?或者我應該考慮設置身份驗證的其他模式? – aeisele

+0

好吧,我一定有錯過了你一下,認證是想要訪問兔子的應用程序。 RabbitMQ所做的是發送消息,並且非常擅長髮送消息。因此,在這種情況下,您將嚮應用程序發送消息,然後該消息會根據消息中的信息查詢數據庫。 –

+0

我想這可能是可能的。 – aeisele