Skip to content

排他サブスクリプション

排他サブスクリプションは、EMQXがサポートする拡張されたMQTT機能です。これはトピックに対して相互排他的なサブスクリプションを可能にします。つまり、同時に1つのサブスクライバーのみがトピックをサブスクライブでき、現在のサブスクライバーがサブスクリプションを解除するまで、他のサブスクライバーは該当トピックをサブスクライブできません。

サブスクリプションを排他にするには、トピック名の先頭にプレフィックスを追加する必要があります。以下の表は例を示しています。

プレフィックス実際のトピック名
$exclusive/t/1$exclusive/t/1

クライアントA$exclusive/t/1をサブスクライブすると、A$exclusive/t/1のサブスクリプションをキャンセルするまで、他のクライアントは$exclusive/t/1をサブスクライブできません。

TIP

排他サブスクリプションは必ず$exclusive/で始まる必要があります。上記の例では、他のクライアントはt/1を通じて通常通りサブスクライブ可能です。

設定ファイルで排他サブスクリプションを有効化する

排他サブスクリプションはデフォルトで無効です。設定ファイルで以下のように有効化できます。

bash
mqtt.exclusive_subscription.enable = true

MQTTX Desktopで排他サブスクリプションを試す

前提条件

  • MQTTX Desktopを使った基本的なパブリッシュおよびサブスクライブ操作ができること
  • 排他サブスクリプションが有効化されていること
  1. EMQXとMQTTX Desktopを起動します。New Connectionをクリックして、パブリッシャーとしてクライアント接続を作成します。

    • Name欄にDemoと入力します。
    • Host欄にローカルホストの127.0.0.1を入力します(このデモの例として使用)。
    • その他の設定はデフォルトのままにしてConnectをクリックします。

    TIP

    MQTT接続の作成方法については、MQTTX Desktopで詳しく説明しています。

    新規接続の一般設定
  2. さらに2つのMQTT接続を作成し、それぞれSubscriber1Subscriber2と名付けます。

  3. ConnectionsペインでSubscriber1を選択し、New Subscriptionボタンをクリックしてサブスクリプションを作成します。Topicテキストボックスに$exclusive/t/1と入力し、このトピックをサブスクライブします。Confirmをクリックします。

    排他トピックのサブスクライブ
  4. ConnectionsペインでSubscriber2を選択し、同様にNew Subscriptionボタンをクリックしてサブスクリプションを作成します。Topicテキストボックスに$exclusive/t/1と入力し、サブスクライブを試みます。Confirmをクリックします。

    • エラーメッセージが表示されます。
    排他サブスクリプション失敗

MQTTX CLIで排他サブスクリプションを試す

前提条件

  • MQTTX CLIを使った基本的なパブリッシュおよびサブスクライブ操作ができること
  • 排他サブスクリプションが有効化されていること
  1. 以下のコマンドで排他サブスクリプションを行います。

    bash
    mqttx sub -t "$exclusive/t/1"
  2. ステップ1のコマンドを再度実行して、トピック$exclusive/t/1への別のサブスクリプションを試みます。以下のように返されます。

    bash
    subscription negated to t/2 with code 135

    排他サブスクリプションのエラーコード一覧:

    コード理由
    0x8F排他サブスクリプションが有効でない状態で$exclusive/を使用した。
    0x97すでに別のクライアントがこのトピックをサブスクライブしている。