2013-12-23 102 views
20

我對這些高級併發範例很陌生,我已經開始使用scala RX綁定。所以我想了解RX與RabbitMQ或ZeroMQ等消息隊列的區別?RX與消息隊列如rabbitmq或zeromq?

它們都似乎使用訂閱/發佈範例。在某處我看到關於RX在RabbitMQ上運行的推文。

有人可以解釋RX和消息隊列之間的區別嗎?爲什麼我會選擇一個呢?一個可以替代另一個,還是它們是互斥的?它們在哪些方面重疊?

+2

隊列排隊做。 Rx沒有。 Rx未分配。 Rx是事件處理範例,而不僅僅是pub/sub。活動是發佈/訂閱模式。 –

回答

21

值得點擊[system.reactive]標籤上的learn more鏈接,我們在那裏放了一些信息!

從介紹那裏你可以看到,RX是不是一個消息隊列技術:

無功擴展器(Rx)是構成使用觀察序列和LINQ風格的異步和基於事件的程序庫查詢運算符。 System.Reactive是通過庫使用的根名稱空間。使用Rx,開發人員使用LINQ操作符表示異步數據流,並使用Scheduler在異步數據流中對併發進行參數化。簡單地說,Rx = Observables + LINQ + Schedulers。

所以,Rx和消息隊列是真正獨特的技術,可以很好地互補。一個經典的例子是股票價格代碼服務 - 這可能通過消息隊列傳遞,但是隨後由Rx轉換爲組合,聚合和過濾價格。

你可以走得更遠:多爲實體框架變成IQueryable<T>查詢到SQL直接運行在數據庫上,你可以創建一個打開的Rx IQbservable<T>查詢到本機查詢供應商 - 例如Where過濾器可能利用所存在的天然過濾功能在很多消息隊列技術中直接應用過濾器。儘管這是相當多的工作,並且很難。

將消息隊列消息輸入到Rx Subject中並不罕見,以便將來自隊列的傳入消息轉換爲Rx流以便在客戶端輕鬆使用。 Rx還廣泛用於GUI中,用於處理按鈕按下和文本框更改等客戶端事件,從而使通過異步服務器查詢進行拖放式和文本自動完成等傳統困難場景變得更加簡單。有一個很好的手實驗室覆蓋後面的場景here。它是針對Rx的早期發佈而寫的,但仍然非常相關。

我推薦看看Bart de Smet的這個視頻演示,裏面有一個精彩的介紹:Curing Your Event Processing Blues with Reactive Extensions (Rx) - 包括經典的Rx演示,它通過Kinect的實況反饋寫一個查詢來解釋揮手!

+0

好的答案!但是,您需要注意您對Reactive Extensions(Rx)的定義以及您所指的實現。例如,Javascript的Rx擴展不包含調度程序等。 – arcseldon

+0

請記住,'system.reactive'標記是原始的.NET版本,所以我假定在回答時。 –

+1

公平點,但我不太清楚OP是否要求.NET特定的答案。在問題中沒有提及這一點。我的評論不是批評你的優秀答案,只是通過考慮其他實施觀點來加強它。 – arcseldon

8

有人可以解釋RX和這些其他消息隊列之間的區別嗎?

Rx僅僅是事件(任何事件!)的抽象。接收來自分佈式隊列的消息是事件,並且通常,ZeroMQ/RabbitMQ解決方案通常必須使用和組合不同的事件,這是Rx非常擅長的。

所以很多時候,的Rx使得編寫ZeroMQ/RabbitMQ的應用程式多容易比起來,否則:)

+0

您的回答聽起來不錯 - 請您鏈接到Rx和RabbitMQ協作使用的示例 - 例如,您是否有Github回購演示等,其中Rx被用作兔子隊列的消費者。或者您可以在您的答案中包含框架代碼。 – arcseldon

+0

我*可以*指出幾家這樣做的投資銀行,但我不想被起訴。 :)足以說我可以證實這是一種常見的情況。 –

相關問題