Skip to content

共有サブスクライブ

共有サブスクライブは、複数のサブスクライバー間でロードバランシングを実現するためのサブスクライブモードです。クライアントは複数のサブスクリプショングループに分割され、メッセージはすべてのサブスクリプショングループに転送されますが、各サブスクリプショングループ内では同時に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プラットフォームは異なるグループに同時にメッセージを転送し、同じグループに属するサブスクライバーはロードバランシングされた形でメッセージを受信します。

例えば、サブスクライバーs1s2s3がグループg1のメンバーで、サブスクライバーs4s5がグループg2のメンバーであり、全てのサブスクライバーが元のトピックt1をサブスクライブしている場合、共有サブスクライブトピックはそれぞれ$share/g1/t1$share/g2/t1となります。EMQXが元のトピックt1にメッセージmsg1をパブリッシュすると:

  • EMQXはmsg1をグループg1g2の両方に送信します。
  • s1s2s3のうちのいずれか1つだけがmsg1を受信します。
  • s4s5のうちのいずれか1つだけがmsg1を受信します。
グループ用共有サブスクライブ

グループ用でない共有サブスクライブ

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

グループ用でない共有サブスクライブ

共有サブスクライブとセッション

共有サブスクライブの概念とMQTTクライアントのパーシステントセッションの利用は矛盾しており、両方の機能を同時に使用することはできません。共有サブスクライブ機能を使用する場合は、クライアントのclean_sessionパラメータをtrueに設定してクリーンセッションを有効にする必要があります。

パーシステントセッション(clean_session=false)は、サブスクライバーが再接続後にメッセージを失うことなくデータフローを再開できることを保証し、信頼性の高いメッセージ配信に不可欠です。clean_sessionfalseに設定すると、クライアントがオフラインになってもセッションは維持され、デバイスはメッセージを受信し続けます。しかし、デバイスがオフラインのため、受信したメッセージを即座に処理できず、セッション内にメッセージが蓄積される可能性があります。

共有サブスクライブが有効で、同じグループ内の別のデバイスがオフラインのデバイスのデータフローを引き継いだ場合、蓄積されたメッセージは元のデバイスのセッションに属するとみなされるため、引き継いだデバイスはそれらのメッセージを受け取りません。そのため、デバイスが長期間オフラインの場合、パーシステントセッションのメッセージバッファが溢れ、メッセージの損失が発生する恐れがあります。この状況はロードバランシングを妨げ、最終的にはメモリやストレージリソースの枯渇を招き、システムの安定性や全体的なパフォーマンスに悪影響を及ぼします。

パーシステントセッションの詳細については、MQTT Persistent Session and Clean Session Explainedをご参照ください。

MQTTXを使った共有サブスクライブのテスト

MQTTXを使ってクライアントのサブスクライブをシミュレートします。

  • s1、s2はトピック$share/g1/testをサブスクライブ
  • s3はトピックtestをサブスクライブ

shared_subscription_1

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

shared_subscription_2

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

shared_subscription_3