RabbitMQ を使用する利点
1. 総合的なパフォーマンス。rabbitmq は比較的総合的なパフォーマンスを備えており、メッセージミドルウェアの最初の選択肢です。
2. 高い同時実行性。rabbitmq 実装言語は、本質的に高い同時実行性と高可用性を備えた erlang 言語です。
3. タスクの非同期処理。同期処理を必要とせず、時間がかかる操作の非同期処理についてメッセージ キューがメッセージ受信者に通知するため、アプリケーションの応答時間が向上します。
4. アプリケーションの分離 MQ は仲介者に相当し、プロデューサーは MQ を通じてコンシューマーと対話し、アプリケーションを分離します。
コア API インターフェイスとクラス
IModel: AMQP チャネルを表し、ほとんどの操作を提供します
IConnection: AMQP 接続を表します
ConnectionFactory:: IConnection インスタンスを構築する
IBasicConsumer: メッセージ コンシューマを表します
DefaultBasicConsumer: コンシューマーによく使用される基本クラス
限界
クライアントは、符号なし 64 ビット整数 (ulong) をサポートしませんが、符号付き 64 ビット整数をサポートします。
使い方の紹介
名前空間参照
RabbitMQ.Client を使用します。
RabbitMQ に接続する
ConnectionFactory ファクトリー = new ConnectionFactory();
ファクトリー.ユーザー名 = ユーザー;
ファクトリー.パスワード = パス;
ファクトリー.VirtualHost = vhost;
ファクトリー.ホスト名 = ホスト名;IConnection conn = Factory.CreateConnection();
チャンネルを開く
IModel チャネル = conn.CreateModel();
切断する
チャンネル.close();
conn.close();
接続を閉じた後、チャネルは自動的に解放されます
接続は長い接続であり、基礎となるプロトコルは長い接続用に最適化されているため、新しい接続を開くと大きなオーバーヘッドが発生します。チャネルは長い接続でもあり、新しいチャネルを作成するコストははるかに小さくなります。通常の状況では、チャネルは繰り返し作成せずに再利用することをお勧めします。
クライアント名を設定します (複数のクライアントの識別を容易にするために、これを設定することを強くお勧めします)
Factory.ClientProvidedName = "アプリ:監査コンポーネント:イベントコンシューマー";
スイッチとキューを定義してバインドする
channel.ExchangeDeclare(exchangeName, ExchangeType.Direct);
channel.QueueDeclare(キュー名、false、false、false、null);
channel.QueueBind(キュー名、交換名、ルーティングキー、null);
直接削除
channel.QueueDelete("キュー名", false, false);
キューが空の場合は削除します
channel.QueueDelete("キュー名", false, true);
使用されていない場合はキューを削除します (コンシューマーがありません)。
channel.QueueDelete("キュー名", false, true);
キューを削除し、メッセージをクリアします
channel.QueueDelete("キュー名");
発表をする
byte[] messageBodyBytes = System.Text.Encoding.UTF8.GetBytes("Hello, world!");
channel.BasicPublish(exchangeName, routingKey, null, messageBodyBytes);メッセージの公開をきめ細かく制御
byte[] messageBodyBytes = System.Text.Encoding.UTF8.GetBytes("Hello, world!");
IBasicProperties props = channel.CreateBasicProperties();
props.ContentType = "テキスト/プレーン";
props.deliveryMode = 2;
channel.BasicPublish(exchangeName, routingKey, props, messageBodyBytes);ヘッダーパラメータを含むメッセージをパブリッシュする
byte[] messageBodyBytes = System.Text.Encoding.UTF8.GetBytes("Hello, world!");
IBasicProperties props = channel.CreateBasicProperties();
props.ContentType = "テキスト/プレーン";
props.deliveryMode = 2;
props.Headers = new Dictionary<string, object>();
props.Headers.Add("緯度", 51.5252949);
props.Headers.Add("経度", -0.0905493);channel.BasicPublish(exchangeName, routingKey, props, messageBodyBytes);
期限付きでメッセージを投稿する
byte[] messageBodyBytes = System.Text.Encoding.UTF8.GetBytes("Hello, world!");
IBasicProperties props = channel.CreateBasicProperties();
props.ContentType = "テキスト/プレーン";
props.deliveryMode = 2;
props.Expiration = "36000000";channel.BasicPublish(exchangeName, routingKey, props, messageBodyBytes);
ニュースを購読する
var Consumer = 新しい EventingBasicConsumer(チャネル);
Consumer.Received += (ch, ea) =>
{ var body = ea.Body.ToArray(); // ペイロードをコピーまたは逆シリアル化し 、 // メッセージを処理します // ... channel.BasicAck(ea.deliveryTag, false); }; string ConsumerTag = channel.BasicConsume(queueName, false, Consumer);
自動再接続を開始する
Factory.AutomaticRecoveryEnabled = true;
//デフォルトの再接続時間は 5 秒ですが、ここでは 10 秒に設定されています
Factory.NetworkRecoveryInterval = TimeSpan.FromSeconds(10);