RabbitMQへのMQTTデータ取り込み
RabbitMQは、Advanced Message Queuing Protocol(AMQP)を実装した広く利用されているオープンソースのメッセージブローカーです。分散システム間のメッセージングにおいて堅牢かつスケーラブルなプラットフォームを提供します。EMQXはRabbitMQとの統合をサポートしており、MQTTメッセージやイベントをRabbitMQに転送できます。また、RabbitMQサーバーからデータを取得し、EMQXの特定のトピックにパブリッシュすることも可能で、RabbitMQからMQTTへのメッセージ配信を実現します。
本ページでは、EMQXとRabbitMQ間のデータ統合について詳細に解説し、データ統合の作成および検証手順を実践的に説明します。
動作概要
RabbitMQデータ統合は、MQTTベースのIoTデータとRabbitMQの強力なメッセージキュー処理機能をつなぐためにEMQXに標準搭載された機能です。組み込みのルールエンジンコンポーネントを利用することで、EMQXからRabbitMQへのデータ取り込みを簡素化し、複雑なコーディングを不要にします。
RabbitMQ Sinkを例にとると、以下の図はEMQXとRabbitMQ間の典型的なデータ統合アーキテクチャを示しています。

MQTTデータをRabbitMQに取り込む流れは以下の通りです。
- メッセージのパブリッシュと受信:産業用IoTデバイスはMQTTプロトコルを介してEMQXに正常に接続し、リアルタイムのMQTTデータをEMQXにパブリッシュします。EMQXがこれらのメッセージを受信すると、ルールエンジン内でマッチング処理を開始します。
- メッセージデータの処理:メッセージが到着すると、ルールエンジンを通過し、EMQXで定義されたルールによって処理されます。ルールは事前定義された条件に基づき、RabbitMQにルーティングすべきメッセージを判別します。ペイロード変換が指定されている場合は、データ形式の変換、特定情報のフィルタリング、ペイロードの付加情報による拡充などが適用されます。
- RabbitMQへのメッセージ取り込み:ルールによる処理が完了すると、RabbitMQへメッセージを転送するアクションがトリガーされます。処理済みメッセージはシームレスにRabbitMQに書き込まれます。
- データの永続化と活用:RabbitMQはメッセージをキューに格納し、適切なコンシューマーに配信します。メッセージは他のアプリケーションやサービスによって消費され、データ分析、可視化、保存などのさらなる処理に利用されます。
特長と利点
RabbitMQとのデータ統合は、以下の特長とメリットをもたらします。
- 信頼性の高いIoTデータメッセージ配信:EMQXはデバイスからクラウドへの安定した接続とメッセージ配信を保証し、RabbitMQはメッセージの永続化と異なるサービス間の信頼性の高い配信を担い、全体のデータ信頼性を確保します。
- MQTTメッセージの変換:ルールエンジンを利用し、EMQXはMQTTメッセージの抽出、フィルタリング、拡充、変換を実施してからRabbitMQに送信できます。
- 柔軟なメッセージマッピング:RabbitMQデータ統合はMQTTトピックとRabbitMQのルーティングキーおよびエクスチェンジの柔軟なマッピングをサポートし、MQTTとRabbitMQ間のシームレスな統合を実現します。
- 高可用性とクラスター対応:EMQXとRabbitMQはどちらも高可用性のメッセージブローカークラスター構築をサポートし、ノード障害時もサービス継続を可能にします。クラスター機能を活用することで優れたスケーラビリティも実現します。
- 高スループット環境での処理能力:RabbitMQデータ統合は同期・非同期の書き込みモードをサポートし、用途に応じてレイテンシとスループットのバランスを柔軟に調整できます。
はじめる前に
本節では、RabbitMQデータ統合の作成を始める前に必要な準備事項を説明します。RabbitMQサーバーの起動方法やテスト用のエクスチェンジおよびキューの作成方法を含みます。
前提条件
- EMQXデータ統合のルールに関する知識
- データ統合およびリパブリッシュアクションに関する知識
- UNIXターミナルおよび基本コマンドの知識
RabbitMQサーバーの起動
ここではDockerを使ったRabbitMQサーバーの起動方法を紹介します。
以下のコマンドを実行して、管理プラグインを有効にしたRabbitMQサーバーを起動します。管理プラグインにより、WebインターフェースでRabbitMQを監視できます。
docker run -it --rm --name rabbitmq -p 127.0.0.1:5672:5672 -p 127.0.0.1:15672:15672 rabbitmq:3.11-managementDocker HubのRabbitMQのDocker実行に関する情報もご参照ください。
メッセージ受信用のエクスチェンジとキューの作成
RabbitMQサーバー起動後、RabbitMQ管理Webインターフェースを使って、EMQXから転送されるメッセージ受信用のテスト用エクスチェンジとキューを作成できます。既にテスト用のエクスチェンジとキューがある場合はこの節をスキップしてください。
- Webブラウザで http://localhost:15672/ にアクセスし、RabbitMQ管理Webインターフェースを開きます。ログイン画面で以下のデフォルト認証情報を入力し、Loginをクリックします。
- Username:
guest - Password:
guest
- Username:
- 上部メニューのExchangesタブをクリックします。Add a new exchangeを展開し、以下を入力します。
- Name:
test_exchange - Type: ドロップダウンから
directを選択 - Durability:
Durableを選択し、RabbitMQサーバー再起動後もエクスチェンジが残るように設定 - Auto delete:
No - Internal:
No - Arguments: 空欄のまま
- Name:
- Add exchangeボタンをクリックしてエクスチェンジを作成します。
- 上部メニューのQueuesタブをクリックします。Add a new queueを展開し、以下を入力します。
- Type:
Default for virtual host - Name:
test_queue - Durability:
Durableを選択し、キューの永続化を設定 - Arguments: 空欄のまま
- Type:
- Add queueボタンをクリックしてキューを作成します。新しい
test_queueがAll queuesに表示されます。 - キュー名のtest_queueをクリックして詳細ページを開きます。Bindingsを展開し、Add binding to this queueセクションに以下を入力します。
- From exchange:
test_exchange - Routing key:
test_routing_key - Arguments: 空欄のまま
- From exchange:
- Bindボタンをクリックして、
test_queueを指定したルーティングキーでtest_exchangeにバインドします。
メッセージ送信用のキュー作成
RabbitMQ管理Webインターフェースを使って、RabbitMQメッセージ送信用のキューを作成できます。
- RabbitMQ管理Webインターフェースにログインします。
- 上部メニューのQueuesタブをクリックし、Add a new queueを展開して以下を入力します。
- Type:
Default for virtual host - Name:
message-send - Durability:
Durableを選択し、キューの永続化を設定 - Arguments: 空欄のまま
- Type:
- Add queueボタンをクリックしてキューを作成します。新しい
message-sendがAll queuesに表示されます。
コネクターの作成
本節では、Rabbit Sink/SourceをRabbitMQサーバーに接続するためのコネクター作成方法を説明します。
以下の手順はEMQXとRabbitMQをローカルマシンで実行していることを前提としています。RabbitMQが別環境にある場合は設定を適宜調整してください。
ダッシュボードに入り、Integration -> Connectorsをクリックします。
画面右上のCreateをクリックします。
Create ConnectorページでRabbitMQを選択し、Nextをクリックします。
コネクター名を入力します。大文字・小文字の英数字の組み合わせで、例:
my_rabbitmq。接続情報を入力します。
Servers:
host[:port]形式のRabbitMQノードをカンマ区切りで入力します。例:rmq1:5672,rmq2:5672。1つのノードへの接続が失敗した場合、EMQXはリスト内の次のノードに接続を試みます。異なる接続プールワーカーはリスト内の異なる位置から開始され、接続の分散化に寄与します。TIP
EMQX 6.0.4以降、複数のRabbitMQノードを設定可能です。接続確立時にフェイルオーバーが発生しますが、確立済みのAMQP接続はノード間で移行しません。
serverとportで単一ノードを指定する既存設定も引き続き互換性があります。Port: Serversでポート指定がないノードのデフォルトポート。デフォルトは
5672。Username:
guestPassword:
guestVirtual Host: RabbitMQの仮想ホスト。デフォルトは
/。暗号化接続を確立したい場合は、Enable TLSトグルをオンにします。TLS接続の詳細は外部リソースアクセスのTLSを参照してください。
Createをクリックする前に、Test ConnectivityをクリックしてコネクターがRabbitMQサーバーに接続可能かテストできます。
画面下部のCreateボタンをクリックしてコネクター作成を完了します。ポップアップでBack to Connector ListまたはCreate Ruleを選択可能です。Create Ruleを選ぶと以下の選択肢があります。
- Action Outputs: RabbitMQ Sinkを使ったルール作成で、RabbitMQに転送するデータを指定します。RabbitMQ Sinkでルールを作成の手順も参照ください。
- Data Inputs: RabbitMQ Sourceを使ったルール作成。RabbitMQ Sourceでルールを作成の手順も参照ください。
RabbitMQ Sinkでルールを作成する
本節では、ダッシュボード上でソースMQTTトピックt/#からのメッセージを処理し、処理済みデータを設定済みのRabbitMQキューtest_queueに転送するルールの作成方法を説明します。
SQLを定義してルールを作成する
EMQXダッシュボードで、Integration -> Rulesをクリックします。
画面右上のCreateをクリックします。
ルールIDを入力します。例:
my_rule。SQLエディターに以下の文を入力します。トピックパターン
t/#にマッチするMQTTメッセージを転送します。sqlSELECT payload, now_timestamp() as timestamp FROM "t/#"TIP
初心者の方はSQL Examplesをクリックし、Enable TestでSQLルールの学習とテストが可能です。
アクションを追加し、Sinkを設定します。詳細はルールにRabbitMQ Sinkを追加するを参照してください。
アクション追加後、Action Outputsセクションに新規Sinkが表示されます。Create RuleページのSaveボタンをクリックし、ルール作成を完了します。
これでルールが正常に作成されました。Rulesページで新規ルールを確認でき、**Actions (Sink)**タブに新しいRabbitMQ Sinkが表示されます。
また、Integration -> Flow Designerでトポロジーを確認できます。トポロジーはトピックt/#のメッセージがルールmy_ruleで解析され、RabbitMQに書き込まれる流れを視覚的に示します。
RabbitMQ Sinkの追加
本節では、処理結果をRabbitMQに書き込むためのSinkをルールに追加する方法を説明します。
Create RuleページのAction OutputsセクションでAdd Actionをクリックし、ルールでトリガーされるアクションを定義します。このアクションにより、EMQXはルールで処理したデータをRabbitMQに送信します。
Type of Actionドロップダウンから
RabbitMQを選択します。ActionはデフォルトのCreate Actionのままにします。既存のSinkを選択することも可能ですが、ここでは新規Sinkを作成します。Sinkの名前を入力します。大文字・小文字の英数字の組み合わせで入力してください。
Connectorドロップダウンから
my_rabbitmqを選択します。新規コネクターを作成する場合はドロップダウン横のボタンをクリックしてください。設定パラメータの詳細はコネクターの作成を参照ください。Sinkの設定を以下のように行います。
Exchange: 事前に作成した
test_exchangeを入力します。メッセージはこのエクスチェンジにパブリッシュされます。注意
RabbitMQにエクスチェンジが作成済みであることを確認してください。存在しない場合、アクションは一時的に動作しなくなり、定期的に再接続を試みます。
Routing Key: 事前に作成した
test_routing_keyを入力します。RabbitMQのメッセージパブリッシュ用ルーティングキーです。TIP
エクスチェンジとルーティングキーはテンプレート値として設定可能で、プレースホルダーを使いMQTTメッセージペイロードから動的に値を抽出してルーティングできます。
例として、ペイロード内のフィールドに基づいてルーティングキーを動的に設定する場合、
${payload.akey}のように設定します。これによりペイロードのakeyフィールドの値がルーティングキーとして使われます。注意:バッチモードでは、エクスチェンジとルーティングキーのテンプレート値はバッチ内の全メッセージで一定である必要があります。これによりバッチ処理中のルーティングの一貫性が保たれます。
Virtual Host: RabbitMQの仮想ホスト。デフォルトは
/。Message Delivery Modeドロップダウンから
non_persistentまたはpersistentを選択します。non_persistent(デフォルト):メッセージはディスクに永続化されず、RabbitMQの再起動やクラッシュ時に失われる可能性があります。persistent:メッセージはディスクに永続化され、RabbitMQの再起動やクラッシュ時にも耐久性があります。TIP
メッセージの損失を防ぐために、キューとエクスチェンジもDurable(永続化)に設定する必要があります。詳細はRabbitMQのドキュメントを参照してください。
Wait for Publish Confirmations: デフォルトで有効。RabbitMQへのメッセージパブリッシュ成功を確認します。
TIP
このオプションが有効な場合、RabbitMQブローカーはメッセージ受領をアック(ACK)してからパブリッシュ成功とみなすため、メッセージ配信の信頼性が向上します。
Headers TemplateおよびProperties Template: テンプレートを用いてRabbitMQのカスタムヘッダーおよびプロパティを定義できます。詳細はヘッダーとプロパティテンプレートの設定を参照してください。
Payload Template: デフォルトは空文字列で、メッセージペイロードをJSON形式のテキストとしてRabbitMQにそのまま転送します。
プレースホルダーを用いてカスタムメッセージペイロード形式を定義することも可能です。例えば、MQTTメッセージのペイロードとタイムスタンプを含めたい場合、以下のテンプレートを使用します。
json{"payload": "${payload}", "timestamp": ${timestamp}}このテンプレートは、MQTTメッセージのペイロードとタイムスタンプを含むJSON形式のメッセージを生成します。
${payload}および${timestamp}はプレースホルダーで、転送時に実際の値に置き換えられます。
フォールバックアクション(任意): メッセージ配信失敗時の信頼性向上のため、1つ以上のフォールバックアクションを定義できます。詳細はフォールバックアクションを参照してください。
詳細設定(任意):
- Publish Confirmation Timeout: デフォルト30秒。パブリッシュ確認のタイムアウト時間で、ブローカーのアック待ち時間を指定します。
- 必要に応じてsyncまたはasyncクエリモードを選択します。詳細はSinkの機能を参照してください。
Createをクリックする前に、Test ConnectivityをクリックしてSinkがRabbitMQサーバーに接続可能かテストできます。
CreateボタンをクリックしてSinkの設定を完了します。作成成功後、ルール作成ページに戻り、新規SinkがAction Outputsに追加されます。
ヘッダーとプロパティテンプレートの設定
EMQX 6.0以降、RabbitMQ Sinkアクション作成時にカスタムのRabbitMQヘッダーおよびプロパティを定義可能です。これにより、メッセージにメタデータを直接付与し、RabbitMQ内でのメッセージ互換性やルーティングの柔軟性が向上します。
これらのフィールドはルールSQLの結果変数(例:${payload.device_id})をテンプレートとして使用できます。ヘッダーおよびプロパティテンプレートは任意で、空欄の場合は追加メタデータは付与されません。
ヘッダーテンプレートの設定方法
RabbitMQヘッダーとして1つ以上のキー・バリューのペアを追加できます。これらはユーザー定義のメタデータで、RabbitMQのコンシューマーが解釈可能です。
- Key: ヘッダー名。文字列で指定。
- Value: キーに対応する値。静的文字列またはテンプレート変数を使用可能。
例:MQTTペイロードからデバイスIDを含める場合
| Key | Value |
|---|---|
device_id | ${payload.device_id} |
プロパティテンプレートの設定方法
RabbitMQは標準のメッセージプロパティセットをサポートします。EMQXはこれらを定義可能で、メッセージレベルのメタデータ(コンテンツタイプや相関IDなど)を付与できます。
- Key: 下記の有効なプロパティキーから選択(無効なキーは無視されます)。
- Value: 静的値またはテンプレート変数を設定。
有効なプロパティキー一覧:
content_typecontent_encodingprioritycorrelation_idreply_toexpirationmessage_idtimestamptypeuser_idapp_idcluster_id
例:コンテンツタイプとアプリIDを指定する場合
| Key | Value |
|---|---|
content_type | application/json |
app_id | my_iot_app |
利用例
MQTTメッセージペイロードが以下の場合:
{
"device_id": "sensor-123",
"status": "ok"
}以下を設定したいとします。
- ヘッダーにMQTTペイロード由来の
device_id - プロパティに静的値の
app_id
設定例:
Headers Template:
| Key | Value |
|---|---|
device_id | ${payload.device_id} |
Properties Template:
| Key | Value |
|---|---|
app_id | my_app |
この設定により、RabbitMQに転送されるすべてのメッセージに対して、
- コンシューマーロジック用のカスタムメタデータ(ヘッダー)
- メッセージ処理やデバッグ用の標準メタデータ(プロパティ)
が付与されます。
RabbitMQ Sinkを使ったルールのテスト
EMQXダッシュボード内蔵のWebSocketクライアントを使い、ルールとSinkの動作をテストできます。
ダッシュボード左メニューのDiagnose -> WebSocket Clientをクリックします。
現在のEMQXインスタンスの接続情報を入力します。
- ローカルでEMQXを実行している場合はデフォルト値を利用可能です。
- 認証設定を変更している場合は、ユーザー名・パスワードを入力してください。
ConnectをクリックしてクライアントをEMQXに接続します。
下にスクロールしてパブリッシュエリアに以下を入力します。
- Topic:
t/test - Payload:
Hello World RabbitMQ from EMQX - QoS:
2
- Topic:
Publishをクリックしてメッセージを送信します。
Sinkとルールが正常に作成されていれば、指定したエクスチェンジに指定ルーティングキーでメッセージがパブリッシュされます。
http://localhost:15672 のRabbitMQ管理コンソールにアクセスし、Queuesセクションに移動します。
TIP
デフォルト設定の場合、ユーザー名・パスワードともに
guestを使用してください。メッセージが適切なキューにルーティングされていることを確認します。キューをクリックして詳細を開き、**Get Message(s)**ボタンをクリックするとメッセージ内容を確認できます。

RabbitMQ Sourceでルールを作成する
本節では、RabbitMQキューからEMQXへデータを転送するルールの作成方法を説明します。RabbitMQ Sourceとメッセージリパブリッシュアクションの両方を作成し、RabbitMQサービスからメッセージを消費してEMQXに転送します。
ダッシュボードのIntegration -> Rulesページに移動します。
画面右上のCreateをクリックします。
ルールIDに
my_rule_sourceを入力します。ルールをトリガーするソース(Data Inputs)を設定します。画面右のData Inputsタブをクリックし、デフォルトの
Messages入力を削除してから、Add InputをクリックしRabbitMQ Sourceを作成します。Add Inputポップアップで、Input Typeドロップダウンから
RabbitMQを選択します。SourceドロップダウンはデフォルトのCreate Sourceのままにします。この例では新規Sourceを作成し、ルールに追加します。SourceのNameと(任意で)Descriptionを入力します。名前は大文字・小文字の英数字の組み合わせで、例:
my-rabbitmq-source。Connectorドロップダウンから先ほど作成した
my-rabbitmqコネクターを選択します。新規コネクター作成はドロップダウン横のボタンから可能です。設定パラメータはコネクターの作成を参照してください。Source情報を設定し、RabbitMQからEMQXへのメッセージ消費設定を完了します。
- Queue: 先にRabbitMQで作成したキュー名
message-sendを入力します。 - No Ack: RabbitMQの
no_ackモードでメッセージを消費するか選択します。no_ackモードを有効にすると、RabbitMQはメッセージをコンシューマーが正常処理する前に即座にキューから削除します。 - Wait for Publish Confirmations: メッセージパブリッシャーのアック待ちを行うか指定します。
- Queue: 先にRabbitMQで作成したキュー名
詳細設定(任意):デフォルト値を使用します。
CreateボタンをクリックしてSource作成を完了し、ルールのデータ入力に追加します。同時にルールSQLは以下のように変更されます。
sqlSELECT * FROM "$bridges/rabbitmq:my-rabbitmq-source"RabbitMQ Sourceから以下のフィールドにアクセス可能で、SQLを調整してデータ処理が行えます。ここではデフォルトSQLを使用します。
フィールド名 説明 payload RabbitMQメッセージの内容 event イベントトピック。形式は $bridges/rabbitmq:<source name>metadata ルールID情報 timestamp メッセージがEMQXに到着したタイムスタンプ node メッセージが到着したEMQXノード名 queue メッセージを消費したキュー名 exchange メッセージがルーティングされたエクスチェンジ routing_key エクスチェンジからキューへメッセージをルーティングする際のルーティングキー
これでRabbitMQ Sourceの作成は完了しましたが、購読したデータは直接EMQXにパブリッシュされません。次に、SourceのメッセージをEMQXに転送するためのメッセージリパブリッシュアクションを作成します。

ルールにリパブリッシュアクションを追加する
本節では、RabbitMQ Sourceから消費したメッセージをEMQXトピックt/1にパブリッシュするためのリパブリッシュアクション追加方法を説明します。
画面右のAction Outputタブを選択し、Add Actionボタンをクリックします。Type of Actionドロップダウンから
Republishアクションを選択します。メッセージリパブリッシュの設定を入力します。
- Topic: MQTTパブリッシュ先トピック。ここでは
t/1を入力。 - QoS:
0、1、2、${qos}のいずれかを選択、または他フィールドからQoSを設定するプレースホルダーを入力可能。${qos}を選択すると元メッセージのQoSに従います。 - Retain:
trueまたはfalseを選択。メッセージをリテインメッセージとしてパブリッシュするか決定します。プレースホルダーも利用可能。ここではfalseを選択。 - Payload: 転送メッセージペイロードのテンプレートを設定。空欄はルール出力結果をそのまま転送。ここでは
${payload}を入力し、ペイロードのみ転送。 - MQTT 5.0 Message Properties: デフォルトは無効。詳細はリパブリッシュアクションの追加を参照。
- Topic: MQTTパブリッシュ先トピック。ここでは
Createをクリックしてアクション作成を完了します。成功するとルール作成ページに戻り、リパブリッシュアクションがAction Outputsタブに追加されます。
ルール作成ページでCreateボタンをクリックし、ルール全体の作成を完了します。
これでルールが正常に作成されました。Rulesページで新規ルールを確認でき、Sourcesタブに新規RabbitMQ Sourceが表示されます。
また、Integrate -> Flow Designerでトポロジーを確認できます。トポロジーにより、RabbitMQ Sourceからのメッセージがリパブリッシュを経てt/1にパブリッシュされる流れを直感的に把握できます。
RabbitMQ Sourceを使ったルールのテスト
MQTTX CLIを使い、トピック
t/1をサブスクライブします。bashmqttx sub -t t/1以下のコマンドでRabbitMQにメッセージを送信できます。
bashrabbitmqadmin --username=guest --password=guest \ publish routing_key=message-send \ payload="{ \"msg\": \"Hello EMQX\"}"publishはメッセージをパブリッシュするコマンドです。routing_key=message-sendオプションはメッセージのルーティングキーを設定します。この例ではキュー名をルーティングキーとして使用しています。payload="{ \"msg\": \"Hello EMQX\"}"オプションはメッセージ内容を設定します。
または、RabbitMQ管理インターフェースからもメッセージをパブリッシュ可能です。
- 上部メニューのQueuesタブをクリック。
- Name列の
message-sendをクリックし詳細ページを開く。 - Publish messageを展開し、Payloadボックスに
"Hello EMQX"を入力し、Publish messageボタンをクリック。
MQTTXで以下のような出力を確認できます。
bash[2024-2-23] [16:59:28] › payload: {"payload":{"msg":"Hello EMQX"},"event":"$bridges/rabbitmq:my-rabbitmq-source","metadata":{"rule_id":"rule_0ly1"},"timestamp":1708678768449,"node":"emqx@127.0.0.1"}