2016-06-29 86 views
23

我想學習消息系統。我發現RabbitMq和NServiceBus在幾個地方一起使用。我的問題是NServiceBus和兔子MQ或卡夫卡

  1. 如果我使用RabbitMQ那麼爲什麼我需要NServiceBus?反之亦然
  2. 什麼NServiceBus可以做,但RabbitMQ或Kafka不能?
  3. 我可以一起使用NServiceBus和kafka嗎?或者Apache-Kafka不需要NServiceBus
+0

相關的第二個問題(http://stackoverflow.com/questions/9558128/specific-advantages-of-nservicebus-over-plan-rabbitmq) – vappolinario

+0

@vappolinario感謝您的支持。卡夫卡是否一樣? – MJK

+0

我從來沒有使用過卡夫卡,所以我不知道 – vappolinario

回答

46

幾年前,我問自己同樣的問題。我在尋找NServiceBus來處理不同的消息隊列,但問題是一樣的。

我決定不使用NServiceBus。

6個月後,我意識到我已經重建了NServiceBus的一半......只有更差的。

爲什麼需要NServiceBus與RabbitMQ相當的問題是問你爲什麼需要帶有ASP.NET MVC,WinForms或XAML的.NET Framework,或者.NET的任何內置庫附帶,當你有公共語言運行時。

CLR應該不夠嗎?

當然不是。運行代碼可以執行的運行時(MSIL解釋器和執行引擎)不足以提高生產力。

當然,你可以編寫命令行應用程序,它接受輸入併產生輸出。但是嘗試構建一個沒有公共庫的真實應用程序 - 沒有內置的SQL Server驅動程序;沒有任何第三方控件或庫。構建一個沒有System.Windows命名空間的Windows桌面應用程序。

您需要這些庫來爲您提供集合,數據庫訪問,窗口對象和UI控件。

同樣,RabbitMQ爲您提供開始工作所需的一切,但不足以維持生產力。

當然,您可以抓取RabbitMQ的.NET驅動程序,並開始生成和使用消息。

有一段時間,這將工作得很好。

很快,您會發現自己在驅動程序周圍創建了一個包裝,因此您可以減少需要編寫的代碼量。

然後你會發現自己需要應對ack vs nack,你會爲此創建一個簡單的API。

然後,需要死信隊列會隨着nack調用彈出,並且你會將它包裝到你的API中 - 當然,與rabbitmq驅動程序相比,它是簡化的。

最終,您會想要處理有害消息 - 格式錯誤並導致異常的消息。再一次,你不想爲此編寫一次性代碼,所以你會寫一個庫來處理它。

該列表會繼續顯示。

從現在開始6個月後,您會發現自己正在使用一個半寫的,幾乎沒有指定的,無法測試的庫,它只模仿NServiceBus(或MassTransit或您選擇的任何其他服務總線庫)的價值和功能。

我不會說你必須使用NServiceBus。我想說你應該學習RabbitMQ如何工作,沒有它。但是,一旦超越了發送和接收消息的基礎,NServiceBus和其他服務總線實現的價值就會非常快速地變得非常明顯。

+0

我終於有了一個簡潔的答案! 「爲什麼需要將NServiceBus與RabbitMQ結合使用的等價問題是詢問爲什麼您需要帶有ASP.NET MVC,WinForms或XAML的.NET Framework或.NET附帶的任何內置庫,當你有命令語言運行時。「宣佈我要發推。 –

+0

@Derick很好的解釋。非常感謝您花時間解釋這一點。現在已經足夠明確 – MJK

+0

謝謝,寫得很好。 –