web-dev-qa-db-ja.com

NServiceBusおよびRabbit MQまたはKafka

メッセージングシステムを学習しようとしています。 RabbitMqとNServiceBusがいくつかの場所で一緒に使用されていることがわかりました。私の質問は

  1. RabbitMQを使用している場合、NServiceBusが必要なのはなぜですか?およびその逆
  2. NServiceBusには何ができますが、RabbitMQまたはKafkaではできませんか?
  3. NServiceBusとkafka=を一緒に使用できますか?またはApache-KafkaはNServiceBusを必要としません
51
MJK

数年前、私は自分自身に同じ質問をしました。 NServiceBusを別のメッセージキューで動作するように見ていましたが、問題は同じでした。

NServiceBusを使用しないことにしました。

6か月後、NServiceBusの半分を再構築したことに気づきました。

RabbitMQでNServiceBusが必要な理由の同等の質問は、ASP.NET MVC、WinForms、XAML、または.NETに付属する組み込みライブラリのいずれかを備えた.NET Frameworkが必要な理由を尋ねることです。共通言語ランタイムがあります。

結局のところ、CLRで十分ではないでしょうか?

もちろん違います。コードを実行できるランタイム(MSILインタープリターと実行エンジン)を用意するだけでは、生産性を高めるのに十分ではありません。

もちろん、入力を受け取って出力を生成するコマンドラインアプリケーションを作成できます。ただし、共通のライブラリなしで、組み込みのSQL Serverドライバーなしで、実際のアプリケーションを構築してください。サードパーティのコントロールやライブラリはありません。 System.Windows名前空間なしでWindowsデスクトップアプリを構築します。

コレクション、データベースアクセス、およびウィンドウオブジェクトとUIコントロールを提供するには、これらのライブラリが必要です。

同様に、RabbitMQは、作業を開始して作業するために必要なすべてを提供しますが、生産性を維持するには不十分です。

もちろん、RabbitMQの.NETドライバーを取得して、メッセージの生成と消費を開始できます。

しばらくの間、これはうまく機能します。

すぐに、ドライバーのラッパーを作成することに気付くので、書く必要のあるコードの量を減らすことができます。

次に、ack vs nackに対処する必要があることに気づき、そのためのシンプルなAPIを作成します。

次に、送達不能キューの必要性がnack呼び出しでポップアップし、それをAPIでラップします-もちろん、rabbitmqドライバーと比較して単純化されます。

最終的には、有害なメッセージ-不正な形式で例外を引き起こすメッセージに対処する必要があります。繰り返しになりますが、このための1回限りのコードを書きたくないので、それを処理するライブラリを作成します。

リストは延々と続く。

6か月後、NServiceBus(またはMassTransitまたは選択した他のサービスバスライブラリ)の値と機能のみを模倣する、半分書かれた、ほとんど指定されていない、テスト不能なライブラリを使用することになります。

NServiceBusを使用する必要はありません。そして、RabbitMQがどのように機能するかを、それなしで学ぶ必要があると思います。ただし、メッセージの送受信の基本を超えると、NServiceBusおよびその他のサービスバスの実装の価値が非常にすぐに明らかになります。

93
Derick Bailey

Kafka NServiceBusでのトランスポートは現在サポートされています: https://docs.particular.net/nservicebus/kafka/ (自分で試していない)まだ)。

1