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();
}
}
}
実行驗證ワークフロー
メッセージング基盤は通常、レシーバーの継続稼働を前提とした設計となります。異なる端末セッションを使用して以下の手順で検証を行います。
- まずサブスクライバ側を起動し、待受け状態へ移行させる
cd ConsumerApp && dotnet run - 次にパブリッシャー側を実行し、データ書き込みトリガーを発火させる
cd ProducerApp && dotnet run
正常にトンネルが確立されると、コンシューマーの標準出力に「Initialization sequence complete.」が即座に表示されます。生産環境へ転用する際は、ディスク水位線の監視、エクスチェンジタイプの変更(fanout, direct など)、および永続化フラグ(durable: true)の有効化といった信頼性担保の設定変更が必要です。