排他サブスクリプション
排他サブスクリプションは、EMQXがサポートする拡張されたMQTT機能です。これはトピックに対して相互排他的なサブスクリプションを可能にします。つまり、同時に1つのサブスクライバーのみがトピックをサブスクライブでき、現在のサブスクライバーがサブスクリプションを解除するまで、他のサブスクライバーは該当トピックをサブスクライブできません。
サブスクリプションを排他にするには、トピック名の先頭にプレフィックスを追加する必要があります。以下の表は例を示しています。
例 | プレフィックス | 実際のトピック名 |
---|---|---|
$exclusive/t/1 | $exclusive/ | t/1 |
クライアントAが$exclusive/t/1
をサブスクライブすると、Aが$exclusive/t/1
のサブスクリプションをキャンセルするまで、他のクライアントは$exclusive/t/1
をサブスクライブできません。
TIP
排他サブスクリプションは必ず$exclusive/
で始まる必要があります。上記の例では、他のクライアントはt/1
を通じて通常通りサブスクライブ可能です。
設定ファイルで排他サブスクリプションを有効化する
排他サブスクリプションはデフォルトで無効です。設定ファイルで以下のように有効化できます。
mqtt.exclusive_subscription.enable = true
MQTTX Desktopで排他サブスクリプションを試す
前提条件
- MQTTX Desktopを使った基本的なパブリッシュおよびサブスクライブ操作ができること
- 排他サブスクリプションが有効化されていること
EMQXとMQTTX Desktopを起動します。New Connectionをクリックして、パブリッシャーとしてクライアント接続を作成します。
- Name欄に
Demo
と入力します。 - Host欄にローカルホストの
127.0.0.1
を入力します(このデモの例として使用)。 - その他の設定はデフォルトのままにしてConnectをクリックします。
TIP
MQTT接続の作成方法については、MQTTX Desktopで詳しく説明しています。
- Name欄に
さらに2つのMQTT接続を作成し、それぞれ
Subscriber1
とSubscriber2
と名付けます。Connectionsペインで
Subscriber1
を選択し、New Subscriptionボタンをクリックしてサブスクリプションを作成します。Topicテキストボックスに$exclusive/t/1
と入力し、このトピックをサブスクライブします。Confirmをクリックします。Connectionsペインで
Subscriber2
を選択し、同様にNew Subscriptionボタンをクリックしてサブスクリプションを作成します。Topicテキストボックスに$exclusive/t/1
と入力し、サブスクライブを試みます。Confirmをクリックします。- エラーメッセージが表示されます。
MQTTX CLIで排他サブスクリプションを試す
前提条件
- MQTTX CLIを使った基本的なパブリッシュおよびサブスクライブ操作ができること
- 排他サブスクリプションが有効化されていること
以下のコマンドで排他サブスクリプションを行います。
bashmqttx sub -t "$exclusive/t/1"
ステップ1のコマンドを再度実行して、トピック
$exclusive/t/1
への別のサブスクリプションを試みます。以下のように返されます。bashsubscription negated to t/2 with code 135
排他サブスクリプションのエラーコード一覧:
コード 理由 0x8F 排他サブスクリプションが有効でない状態で $exclusive/
を使用した。0x97 すでに別のクライアントがこのトピックをサブスクライブしている。