RabbitMQの基本概念とC#によるメッセージング実装

RabbitMQアーキテクチャとC#クライアントの初期構成

RabbitMQはオープンソースのメッセージブローカーであり、AMQP 0-9-1プロトコルをネイティブに実装しています。システム間の疎結合な非同期通信を担うため、物理的な伝送路ではなく、バイナリ形式のペイロードを中継・蓄積・配信するための堅牢なインフラストラクチャとして機能します。

コア概念的定義

  • プロデューサー(Publisher): アプリケーション外からデータを生成し、ブローカーへ送信するプロセス。
  • キュー(Queue): メッセージが一時滞留する内部的なバッファ領域。メモリおよびストレージの許容範囲内において無制限に拡張可能であり、単一または複数からの書き込み、並列読み取りに対応します。
  • コンシューマー(Subscriber): キューからデータを引き出し、ビジネスロジックを実行するリスニングエージェント。

開発環境の準備

C#環境での利用には公式パブリッシングライブラリ RabbitMQ.Client を採用します。.NET SDKツールチェーンが存在することを前提とし、以下のコマンドで双方向のプロセス構造を生成します。

# 送信側プロジェクトの作成
mkdir ProducerApp
cd ProducerApp
dotnet new console

# 受信側プロジェクトの作成
mkdir ConsumerApp
cd ConsumerApp
dotnet new console

# 依存パッケージの統合
dotnet add package RabbitMQ.Client --version 6.8.1

データ送信ロジックの実装

プロデューサー側では、ブローカーアドレスへTCPセグメントを張った後、セッションチャンネルを開放してキュー定義を行なったうえでUTF-8エンコード済みの文字列を公開します。

using System;
using System.Text;
using RabbitMQ.Client;

namespace MessagePublisher
{
    public class Program
    {
        public static void Main()
        {
            // 接続パラメータの設定
            var factory = new ConnectionFactory
            {
                HostName = "localhost",
                Port = AmqpTcpEndpoint.UseDefaultPort
            };

            // スコープ脱出時にリソースを自動的に解放
            using var connection = factory.CreateConnection();
            using var channel = connection.CreateChannel();

            // キューの初期化(既存時はスキップ)
            const string queueIdentifier = "sample_task_queue";
            channel.QueueDeclare(queue: queueIdentifier,
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null);

            // ペイロード変換と公開
            const string rawData = "Initialization sequence complete.";
            var encodedPayload = Encoding.UTF8.GetBytes(rawData);

            channel.BasicPublish(exchange: string.Empty,
                                 routingKey: queueIdentifier,
                                 basicProperties: null,
                                 body: encodedPayload);

            Console.WriteLine($"[PUB] キュー '{queueIdentifier}' に配信完了しました。");
            Console.WriteLine("終了するには Enter キーを入力してください。");
            Console.ReadLine();
        }
    }
}

データ受信ロジックの実装

コンシューマー側は常駐型実行が想定されます。イベント駆動型の消費者(EventingBasicConsumer)を導入することで、ブローカーからのプッシュ通知を同期的なブロック処理なしで検知できます。

using System;
using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;

namespace MessageSubscriber
{
    public class Program
    {
        public static void Main()
        {
            var factory = new ConnectionFactory { HostName = "localhost" };

            using var connection = factory.CreateConnection();
            using var channel = connection.CreateChannel();

            // プロデューサーと同一の名前空間を事前に宣言
            const string queueIdentifier = "sample_task_queue";
            channel.QueueDeclare(queue: queueIdentifier,
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null);

            // 受信用ハンドラインスタンスの生成
            var receiver = new EventingBasicConsumer(channel);

            // 着信イベントのバインド
            receiver.Received += (sender, args) =>
            {
                byte[] incomingBytes = args.Body.ToArray();
                string parsedText = Encoding.UTF8.GetString(incomingBytes);
                Console.WriteLine($"[SUB] 着信メッセージ: {parsedText}");
            };

            // 消費処理の起動(acksは自動承認モード)
            channel.BasicConsume(queue: queueIdentifier,
                                 autoAck: true,
                                 consumer: receiver);

            Console.WriteLine("リスニング状態です。強制終了するには Ctrl+C を押下してください。");
            Console.ReadLine();
        }
    }
}

実行驗證ワークフロー

メッセージング基盤は通常、レシーバーの継続稼働を前提とした設計となります。異なる端末セッションを使用して以下の手順で検証を行います。

  1. まずサブスクライバ側を起動し、待受け状態へ移行させる
    cd ConsumerApp && dotnet run
  2. 次にパブリッシャー側を実行し、データ書き込みトリガーを発火させる
    cd ProducerApp && dotnet run

正常にトンネルが確立されると、コンシューマーの標準出力に「Initialization sequence complete.」が即座に表示されます。生産環境へ転用する際は、ディスク水位線の監視、エクスチェンジタイプの変更(fanout, direct など)、および永続化フラグ(durable: true)の有効化といった信頼性担保の設定変更が必要です。

タグ: RabbitMQ .NET Core C# AMQP MessageBroker

10月5日 01:42 投稿