Part1 紹介

EasyNetQ は、RabbitMQ のためのシンプルで使いやすい .NET API です。
すぐに使い始めたい場合は、クイックスタートガイドをご覧ください。
EasyNetQ の目標は、.NET で RabbitMQ を可能な限りシンプルに使用するためのライブラリを提供することです。そのために、いくつかの簡単な規約を強制することで、柔軟性を犠牲にしてシンプルさを実現しています。これには次のものが含まれます。
- メッセージは
.NET型で表現されるべきである。 - メッセージはその
.NET型に基づいてルーティングされるべきである。
つまり、メッセージは .NET クラスによって定義されます。送信するメッセージの種類ごとに、1つのクラスが対応します。このクラスは public であり、デフォルトコンストラクターと public の 読み取り/書き込み プロパティを持つ必要があります。通常、メッセージに機能を実装するのではなく、単純なデータコンテナまたはデータ転送オブジェクト (DTO) として扱います。以下はシンプルなメッセージの例です。
public class MyMessage
{
public string Text { get; set; }
}
EasyNetQ はメッセージタイプに基づいてメッセージをルーティングします。メッセージを公開するとき、EasyNetQ はその型を調べ、型名、名前空間、およびアセンブリに基づいて ルーティングキー(routing key) を割り当てます。コンシューマー側では、サブスクライバーは型を購読します。型を購読すると、その型のメッセージがサブスクライバーにルーティングされます。
デフォルトでは、EasyNetQ は Newtonsoft.Json ライブラリを使用して .NET 型を JSON にシリアライズします。これにより、メッセージが人間が読める形式になるため、RabbitMQ 管理アプリケーションなどのツールを使用してメッセージの問題をデバッグできるという利点があります。
Part2 API 設計

EasyNetQ は、RabbitMQ.Client ライブラリの上にサービスを提供するコンポーネントのコレクションです。これらは、シリアライゼーション、エラーハンドリング、スレッドマーシャリング、接続管理などを実行します。これらは mini-IoC コンテナによって構成されています。任意のコンポーネントを独自の実装で簡単に置き換えることができます。したがって、組み込みの JSON ではなく XML シリアライゼーション が必要な場合は、ISerializer の実装を作成してコンテナに登録するだけです。
これらのコンポーネントの前面には IAdvancedBus API があります。これは AMQP 仕様によく似ており、実際にはこの API からほとんどの AMQP メソッドを実行できます。この API が隠している唯一の AMQP 概念はチャネルです。なぜなら、チャネルは混乱を招く低レベルの概念であり、そもそも AMQP 仕様の一部であるべきではなかったからです。正直なところ、「Advanced」はこの API にとってあまり良い名前ではなく、Iamqp の方がはるかに良いでしょう。
Advanced API の上には、一連のメッセージングパターンがあります:パブリッシュ/サブスクライブ、リクエスト/レスポンス、送信/受信。これが EasyNetQ の「意見を持つ」部分です。これは、これらのパターンをどのように実装すべきかに関する私たちの見解です。柔軟性はほとんどありません。あなたが私たちのやり方を受け入れるか、それを使用しないかのどちらかです。目的は、ユーザーであるあなたが、同じパターンを再発明するために頭を使う必要がないことです。メッセージを公開して購読したいだけのたびに選択を迫られることはありません。これは EasyNetQ の中核目標、つまり RabbitMQ を可能な限り簡単に使用できるようにすることを実現するためのものです。
これらのパターンは IBus API の背後にあります。繰り返しますが、これは悪い名前であり、メッセージバスの概念とはほとんど関係ありません。より適切な名前は IPackagedMessagePatterns でしょう。
IBus は、80% のユーザーに対して、80% の時間で動作するように設計されています。これは包括的ではありません。IBus が提供しないパターンを実装する必要がある場合は、IAdvancedBus を使用する必要があります。それで問題ありません。EasyNetQ はそのように設計されています。
Part3 EasyNetQ が必要な理由
RabbitMQ には既に .NET クライアントが存在しませんか?
はい、存在します。こちら から .NET AMQP クライアントライブラリをダウンロードできます。
では、なぜ EasyNetQ が必要なのでしょうか。RabbitMQ .NET クライアントは、AMQP プロトコルのクライアント側を実装しています(RabbitMQ はサーバー側を実装しています)。AMQP はメッセージングにおける HTTP となるように設計されています。クロスプラットフォームで言語に依存しないように設計されています。また、Exchange/Binding/Queue モデルに基づくさまざまなメッセージングパターンを柔軟にサポートするように設計されています。
この柔軟性は素晴らしいですが、柔軟性には複雑さが伴います。つまり、RabbitMQ クライアントを使用するには多くのコードを記述する必要があることを意味します。通常、このコードには次のものが含まれます。
- パブリッシュ/サブスクライブやリクエスト/レスポンスなどのメッセージングパターンの実装。ただし、公平に言えば、.NET クライアントはここである程度のサポートを提供しています。
- ルーティング戦略の実装。Exchange-Queue バインディングをどのように設計し、プロデューサーとコンシューマーの間でメッセージをルーティングするか。
- メッセージのシリアライゼーション/デシリアライゼーションの実装。AMQP 内のメッセージのバイナリ表現をプログラミング言語が理解できるものに変換する方法。
- サブスクリプションのためのコンシューマースレッドの実装。購読するメッセージを待機する専用のコンシューマーループが必要です。複数のサブスクライバーや、リクエスト応答を待つ一時的なサブスクライバーをどのように処理するか。
- サブスクライバーの再接続の実装。接続が切断されたり、RabbitMQ サーバーが再起動した場合、それを検出してすべてのサブスクリプションを再構築する方法。
- サービス品質設定の理解と実装。信頼性の高いクライアントを確保するために必要な設定。
- エラーハンドリング戦略の実装。クライアントが不正なメッセージを受信した場合、または予期しない例外がスローされた場合の対処方法。
- パブリッシャー確認による信頼性の高いメッセージ配信の実装。
EasyNetQ は、これらすべての問題を、既存の AMQP クライアントの上に配置されたシンプルで使いやすいライブラリにカプセル化することを目的としています。これは、大規模な商用環境で RabbitMQ を数年間使用した経験の結晶です。
Part4 簡単な使用例
RabbitMQ ブローカーに接続
var bus = RabbitHutch.CreateBus("host=localhost");
メッセージをパブリッシュ
await bus.PubSub.PublishAsync(message);
5 秒遅延したメッセージをパブリッシュ
await bus.Scheduler.FuturePublishAsync(message, TimeSpan.FromSeconds(5));
メッセージを購読
await bus.PubSub.SubscribeAsync<MyMessage>(
"my_subscription_id", msg => Console.WriteLine(msg.Text)
);
RPC サーバー
await bus.Rpc.RespondAsync<TestRequestMessage, TestResponseMessage>(request =>
new TestResponseMessage{ Text = request.Text + " all done!" }
);
Part5 リンク
- 原文リンク:https://github.com/EasyNetQ/EasyNetQ/wiki/Introduction
- リポジトリリンク:https://github.com/EasyNetQ/EasyNetQ
