[AWS IoT Core] 新規に機能追加された、共有サブスクリプション(MQTTv5) を試してみました

2023.04.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

CX 事業本部のデリバリー部の平内(SIN)です。

昨年末、IoT Coreでサポート開始となったMQTTv5ですが、当初、共有サブスクリプションについては、未サポートとなっていました。

そして、昨日、これが、サポートされたとのアナウンスがありました。

Posted On: Apr 13, 2023
AWS IoT Core announces general availability for MQTT5 Shared Subscriptions and new CloudWatch metrics

MQTTv5の共有サブスクリプションは、MQTTv3から追加された機能の中でも、結構インパクトのあるものだと思うのですが、IoT Coreでは、メッセージブローカーに到着したデータを処理する場合、サブスクライブしなくても「ルール」で効率よく取り込めますし、後段にKinesis Data Streamsなどを挟むことで、簡単にスケールできたので、元々、サポートされていたとも言えると思います。

そういう意味では、IoT Coreでは、活躍できる場面は少ないかな?とも思ってしまいますが、ここは、IoT Coreを純粋なメッセージブローカーとして、サブスクライブしてデータを処理する場面をイメージして、話を進めたいと思います。

2 共有サブスクリプション

共有サブスクリプションは、Publishされたメッセージを複数のクライアントで分散して処理できる機能であり、ロードバランサーのように機能します。

共有サブスクリプションで使用されるトピック名は、以下のような形式です。

$share/{ShareName}/{TopicFilter}

/ で区切られた、最初の $share は、共有サブスクリプションであることを示すフィルタであり、固定の文字列です。

2番目は、グループ名で、ここが同じとなっている複数クライアントが、メッセージを共有します。

3番目以降は、通常のトピック名と同じように機能します。

例えば、sensor/001というトピック名でPublishされたメッセージは、以下のような構文でサブスクライブできます

1. sensor/001
2. sensor/#
3. $share/group1/sensor/001
4. $share/group1/sensor/#
5. $share/group2/sensor/001
6. $share/group2/sensor/#

1、2は、通常通りの使用方法であり、サブスクライブしている全てのクライアントに送信されますが、3,4及び、5,6は、グループ化された共有サブスクリプションであり、グループに複数のクライアントが存在する場合、グループ内のどれか1つのクライアントに順次送信されることになります。

$share/group1/sensor/# を3つのクライアントがサブスクライブしていた場合、 sensor/001にPublishされたメッセージは、3つのクライアントに順番に送信され、結果的に各クライアントの負荷は、1/3となります。

トピックに大量のPublishがあって、複数のSubscriberで分散処理したい場合、簡単に移行ができると思います。

3 動作

ioT Coreの共有サブスクライブは、以下のように機能します。

  • グループ内のサブスクライバーが切断されると、グループ内の残りのサブスクライバーに送信する
  • QoS=0の場合、Publishの再試行は行われない
  • QoS=1の場合、Publishが失敗した場合、別のサブスクライバーに送信され、すべての再試行に失敗した時破棄される
  • 永続セッションを使用する QoS=1 Publishが失敗した場合、キューに入れられず、グループ内の別のサブスクライバーに対して試行される
  • 共有サブスクリプションはRetainedメッセージを受信しない

MQTT 5 supported features/Shared Subscriptions

以下、ちょっと、試してみた様子です。

4 最後に

今回は、新しく機能追加された、共有サブスクリプションについて、その動作を確認してみました。

最初に書いたとおり、ロードバランサーとしてのメリットは、IoT Coreでは感じにくいですが、この仕組みは、もしかすると面白い使い方ができるかもしれません。 共有サブスクリプションは、Publish側には、特に変更がないので、既存のシステムの改善で使用することも可能でしょう。

なお、IoT Coreでは、この機能は、MQTTv5とMQTT3.1の両方で機能するそうです。

5 参考リンク


MQTT 5 supported features/Shared Subscriptions
AWS IoT Core endpoints and quotas
Testing Shared Subscriptions in the MQTT client