1. ホーム
  2. rabbitmq

NServiceBusとRabbit MQまたはKafkaの組み合わせ

2023-08-27 19:24:59

質問

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

  1. RabbitMQを使用している場合、なぜNServiceBusが必要なのですか? その逆も同様です。
  2. NServiceBusにできて、RabbitMQやKafkaにできないことは何ですか?
  3. NServiceBusとkafkaを一緒に使用できますか?または、Apache-Kafkaは、NServiceBusを必要としません。

どのように解決するのですか?

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

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

6ヶ月後、私はNServiceBusが行っていたことの半分を再構築していたことに気づきました...ただ、ずっとお粗末なだけです。

なぜRabbitMQでNServiceBusが必要なのかという質問に相当するのは、なぜASP.NET MVC、WinForms、XAML、または共通言語ランタイムがあるのに、.NETに付属する組み込みライブラリのいずれかを使って.NETフレームワークを必要とするのかと問うことです。

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

もちろんそうではありません。コードが実行できるランタイム、つまり MSIL インタープリターと実行エンジンを持つことは、生産性を高めるには十分ではありません。

確かに、入力を受けて出力を生成するコマンドラインアプリケーションを書くことはできます。しかし、一般的なライブラリなしで、組み込みの SQL Server ドライバーなしで、サード パーティのコントロールやライブラリなしで、実際のアプリケーションを構築してみてください。System.Windows 名前空間なしで Windows デスクトップ アプリケーションを構築してください。

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

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

確かに、RabbitMQ用の.NETドライバを入手して、メッセージの生成と消費を開始することはできます。

しばらくの間、これはうまくいくでしょう。

すぐに、ドライバの周りにラッパーを作成し、書くべきコードの量を減らすことができることに気がつくでしょう。

そして、ack対nackを扱う必要があることに気づき、そのための簡単なAPIを作成することになるでしょう。

そして、nackの呼び出しでデッドレターキューの必要性が出てくるので、それをAPIで包む。もちろん、rabbitmqドライバと比べて単純化する。

最終的には、不正なメッセージや例外を引き起こすメッセージであるポイズンメッセージを扱いたいと思うことでしょう。もう一度言いますが、このために一回限りのコードを書きたくはないでしょうから、それを処理するためのライブラリを書くことになるでしょう。

リストはさらに続きます。

今から6ヶ月後、あなたはNServiceBus(またはMassTransitやあなたが選んだ他のサービスバスライブラリ)の価値と機能を模倣するだけの、中途半端に書かれた、ほとんど指定されていない、テストできないライブラリを使って仕事をしている自分に気づくことでしょう。

NServiceBus を使用しなければならないとは言いません。そして、RabbitMQがどのように動作するか、それなしで学ぶべきであると言います。しかし、メッセージの送受信の基本を超えると、NServiceBusや他のサービスバス実装の価値は、非常に早く明らかになります。