.net で RabbitMQ を使用する場合の注意事項

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);

おすすめ

転載: blog.csdn.net/yunxiaobaobei/article/details/132402212