共有サブスクライブ
共有サブスクライブは、複数のサブスクライバー間でロードバランシングを実現するためのサブスクライブモードです。クライアントは複数のサブスクリプショングループに分割され、メッセージはすべてのサブスクリプショングループに転送されますが、各サブスクリプショングループ内では同時に1つのクライアントのみがメッセージを受信します。EMQXプラットフォームは、共有サブスクライブのプレフィックスとして2つの形式をサポートしています。グループ用共有サブスクライブ($share/<group-name>/で始まる)と、グループ用でない共有サブスクライブ($queue/で始まる)です。
以下に、2つの共有サブスクライブプレフィックス形式の例を示します。
| プレフィックス形式 | 例 | プレフィックス | 実際のトピック名 |
|---|---|---|---|
| グループ用共有サブスクライブ | $share/abc/t/1 | $share/abc/ | t/1 |
| グループ用でない共有サブスクライブ | $queue/t/1 | $queue/ | t/1 |
クライアントツールを使用してEMQXプラットフォームに接続し、このメッセージングサービスを試すことができます。本ページでは共有サブスクライブの仕組みを紹介し、MQTTX Desktopを使ってクライアントをシミュレートし、共有サブスクライブ機能を試す方法を説明します。
グループ用共有サブスクライブ
グループ用共有サブスクライブは、元のトピックにプレフィックス $share/<group-name> を追加することで有効にできます。グループ名は任意の文字列です。EMQXプラットフォームは異なるグループに同時にメッセージを転送し、同じグループに属するサブスクライバーはロードバランシングされた形でメッセージを受信します。
例えば、サブスクライバーs1、s2、s3がグループg1のメンバーで、サブスクライバーs4、s5がグループg2のメンバーであり、全てのサブスクライバーが元のトピックt1をサブスクライブしている場合、共有サブスクライブトピックはそれぞれ$share/g1/t1と$share/g2/t1となります。EMQXが元のトピックt1にメッセージmsg1をパブリッシュすると:
- EMQXは
msg1をグループg1とg2の両方に送信します。 s1、s2、s3のうちのいずれか1つだけがmsg1を受信します。s4とs5のうちのいずれか1つだけがmsg1を受信します。

グループ用でない共有サブスクライブ
$queue/で始まる共有サブスクライブトピックは、グループに属さないサブスクライバー向けです。これは$shareプレフィックスを使った共有サブスクライブトピックの特殊なケースと考えられます。すべてのサブスクライバーが$share/$queueのようなサブスクリプショングループに属していると理解できます。

共有サブスクライブとセッション
共有サブスクライブの概念とMQTTクライアントのパーシステントセッションの利用は矛盾しており、両方の機能を同時に使用することはできません。共有サブスクライブ機能を使用する場合は、クライアントのclean_sessionパラメータをtrueに設定してクリーンセッションを有効にする必要があります。
パーシステントセッション(clean_session=false)は、サブスクライバーが再接続後にメッセージを失うことなくデータフローを再開できることを保証し、信頼性の高いメッセージ配信に不可欠です。clean_sessionをfalseに設定すると、クライアントがオフラインになってもセッションは維持され、デバイスはメッセージを受信し続けます。しかし、デバイスがオフラインのため、受信したメッセージを即座に処理できず、セッション内にメッセージが蓄積される可能性があります。
共有サブスクライブが有効で、同じグループ内の別のデバイスがオフラインのデバイスのデータフローを引き継いだ場合、蓄積されたメッセージは元のデバイスのセッションに属するとみなされるため、引き継いだデバイスはそれらのメッセージを受け取りません。そのため、デバイスが長期間オフラインの場合、パーシステントセッションのメッセージバッファが溢れ、メッセージの損失が発生する恐れがあります。この状況はロードバランシングを妨げ、最終的にはメモリやストレージリソースの枯渇を招き、システムの安定性や全体的なパフォーマンスに悪影響を及ぼします。
パーシステントセッションの詳細については、MQTT Persistent Session and Clean Session Explainedをご参照ください。
MQTTXを使った共有サブスクライブのテスト
MQTTXを使ってクライアントのサブスクライブをシミュレートします。
- s1、s2はトピック
$share/g1/testをサブスクライブ - s3はトピック
testをサブスクライブ

MQTTXでクライアントP1を作成し、トピックtestに3つのメッセージを送信します。

s1がmsg1、msg2を受信し、s2がmsg3を受信、s3はすべてのメッセージを受信します。
