DEV Community

Cover image for PubNubプレゼンスの有効化と設定方法

PubNubプレゼンスの有効化と設定方法

ユーザーがオンラインになったときやオフラインになったとき、あるいはクライアントデバイスが接続されているかどうか、そしていつ切断されたかをどのように検出できますか?PubNubプレゼンスでは、誰があなたのチャンネルに接続しているかをリアルタイムで追跡し、接続ステータスが変化するとアラートで通知します。

Embedded YouTube Video

ビデオを見る

プレゼンスシステムは非常に柔軟で、次のようなユースケースが可能です:

  • ユーザがチャットの会話に参加したり退出したりするタイミングを監視
  • ユーザーがオンラインかオフラインかの検出
  • IoTデバイスが接続されていて利用可能かどうかの判断
  • チャネルに接続しているクライアントの数をカウントする(チャネル占有カウント)

また、クライアントのプレゼンスに付随する状態情報(メタデータ)を定義して、関心のあるすべての受信者が受信できるようにすることもできます。たとえば、クライアントのプレゼンスは「オンライン」ですが、ユーザーはカスタムステータスを「不在」や「邪魔しない」に設定することができます。

PubNubのプレゼンス機能を有効にするには、管理者ポータルにログインし、プレゼンス機能を有効にしたいアプリとキーセットに移動し、そのキーセットの設定画面でプレゼンススイッチを切り替えます:

Portal Configuration: Presence Enable

プレゼンスの有効化を確認するプロンプトが表示されます。

プレゼンス機能を有効にすると、特にトランザクションベースの料金プランの場合、トランザクション数が大幅に増える可能性があることに注意してください。トランザクション数を制御するには、この記事の後半で説明する「プレゼンス管理」機能を使用することができます。

Portal Configuration: Presence Enable Confirm

キーセットの設定を変更した場合は、必ず変更を保存してください。

Portal Configuration: Presence Confirm Changes

アナウンスモード

有効化すると、PubNubはクライアント(ユーザまたはデバイス)が任意のチャネルに登録または登録解除すると、プレゼンスイベントを自動的に生成します。

クライアントがチャンネルを購読すると、参加イベントが生成されます:

{ "channel":"<参加したチャンネル名>", "action":"join", "occupancy":2, // チャンネルの占有率 "uuid":"<参加したクライアントのユーザID>", "timetoken":"<ジョインが発生した日時>" }.
Enter fullscreen mode Exit fullscreen mode

クライアントがチャンネルから退会すると、退会イベントが生成されます:

{ "channel":"<退出したチャンネル名>", "action":"leave", "occupancy":1, // チャネルの占有率 "uuid":"<退出したクライアントのユーザID>", "timetoken":"<離脱が発生した時刻>" }.
Enter fullscreen mode Exit fullscreen mode

ウェブクライアントがあるチャネルに接続していて、クライアントが購読を解除する代わりにユーザが強制的にタブを閉じたとします:

クライアントが明示的に購読を解除せず、一定時間(デフォルトでは300秒)が経過しても存在しないことが検出された場合、タイムアウトイベントが発生します:

{ "channel":"<タイムアウトしたチャネル接続名>", "action":"timeout", "occupancy":1, // チャンネルの占有率 "uuid":"<タイムアウトしたクライアントのユーザID>", "timetoken":"<タイムアウトが発生した時刻>" }
Enter fullscreen mode Exit fullscreen mode

TCP FINまたはRSTでLeaveを生成する

上記のシナリオでタイムアウト・イベントを待つ代わりに、クライアントがチャネルから離脱したときにネットワーク・レベルで検出するという方法もある。 キーセットの'Generate Leave on TCP FIN or RST'オプションを有効にすることで、このシナリオでブラウザタブを強制的に閉じると、タイムアウトイベントの代わりに、即座に発生するleaveイベントが生成されるようになる。

Portal Configuration: Presence Generate Leave TCP FIN RST

デバウンス

ネットワークの問題やアプリケーションの設計が原因で、クライアントがチャネルに参加したり離脱したりすることがあります。 過剰な参加イベントと離脱イベントを避けるために、秒単位でデバウンス値を指定します。 例えば、クライアントが参加イベントを生成した後、さらに2秒間は次の参加イベントを生成できないようにします。

Portal Configuration: Presence Debounce

インターバルモード

アナウンス最大

チャンネル内のクライアント数が「アナウンスマックス」設定(デフォルトは20)以下である限り、参加イベントと退出イベントは即座にトリガーされます。

Portal Configuration: Presence Announce Max

チャネルの参加者数が増えるにつれて、参加イベントと退出イベントの数も増えますが、ある時点で、クライアントがリアルタイムでこれらすべてのイベントを維持しようとするのは無駄が多くなります。 200人の参加者がいるグループ・チャットを考えてみよう。参加者がオンラインになったりオフラインになったりするたびに、クライアントは参加者全員のオンライン状態を更新する必要があるだろうか? それは、人間のユーザーが追跡できる以上の情報になるでしょう。

アナウンスマックスは1~100の間で設定できます。チャネルのクライアント数が'Announce Max'超えると、join、 leavetimeoutイベントは生成されなくなり、intervalイベントに置き換えられる

{ "channel:"<イベントが適用されるチャンネル名>", "action":「interval", "occupancy":4, // チャンネルの占有率 "timetoken":"<インターバルイベントが発生した時>" }
Enter fullscreen mode Exit fullscreen mode

インターバル

Intervalコンフィギュレーションオプションを変更することで、インターバルイベントが発生する頻度を設定できます。 10秒から300秒(5分)までの値を指定できます。

Portal Configuration: Presence Interval

プレゼンス・デルタ' を有効にしない限り、インターバル・イベントはチャネルの占有を通知するだけです。

プレゼンス・デルタ

Portal Configuration: Presence Deltas

プレゼンス・デルタ」を有効にすると、インターバル・イベントには、前回のインターバル・イベント以降にどのユーザーがチャネルに参加したか、またはチャネルから退出したかという情報も含まれます。

{ "channel":"<イベントが適用されるチャンネル名>", "action":"interval", "occupancy":3, // チャネルの占有率 "join":[member4"], "leave":[member3"], "timetoken":"<インターバル・イベントが発生した時>" }
Enter fullscreen mode Exit fullscreen mode

その他の設定

アクティブ通知チャンネル

チャネルに接続しているクライアントの数や、それらのクライアントが誰であるかに興味があるわけではありません。 チャネルの購読者が 0 の場合、そのチャネルは非アクティブとみなされます。 購読者が1人以上いるチャネルはアクティブとみなされます。

アクティブ通知チャネル」を指定することで、チャネルが「アクティブ」または「非アクティブ」になったときに通知を受け取るように登録できます。

Portal Configuration: Presence Active Notice Channel

指定した場合、このチャネルでメッセージを受信することになります (この例では、メッセージを受信するチャネル名は "notice_channel" です):

{ "channel":"<アクティブまたは非アクティブになったチャネル名>", "status":"active", // または "inactive" "precise_timestamp":"<インターバル・イベントが発生した時刻>" }.
Enter fullscreen mode Exit fullscreen mode

アクティブ・イベントはチャネルの占有率が0以上になるとすぐに送信されますが、チャネルの非アクティブ・イベントはチャネルの占有率が0の状態が300秒以上続いた場合にのみ発生することに注意してください。

ストリーム・フィルタリング

ストリームフィルタリングを無効にするオプションは、レガシーな理由から残されています。 ストリームフィルタリングは、プレゼンスチャネルにパブリッシュされたイベントにプレゼンスメタデータを含め、クライアントフィルタをこれらのプレゼンスイベントに適用できるようにします。 ストリームフィルタリングを無効にしても、プレゼンスイベントの数が減るわけではなく、クライアントが受信するイベントをフィルタリングできるようになるだけです。

Portal Configuration: Presence Stream Filtering

ウェブフック

以前は、キーセットの設定ページで、以下のイベントが発生したときに発行される複数のWebhookを指定することができました:

  • 参加イベントの発生
  • 離脱イベントの発生
  • タイムアウトイベント発生
  • intervalイベント発生
  • 状態変化イベント発生
  • チャネルアクティブイベントまたはチャネルインアクティブイベントが発生した。

これらのWebhookはもはやキーセット設定の一部ではなく、Events & Actions機能に移行された。 Webhookについてはこの記事の範囲では説明しませんが、詳細については、Events & ActionsドキュメントのWebhook Payloadアクションセクションを参照してください。

状態の変更

クライアントのプレゼンスに関連するメタデータを交換したい場合、プレゼンスステート機能を使用するのが最適です。 例えば、前述した参加イベントと退出イベントでは、クライアントがオンラインかオフラインかはわかりますが、ユーザーが「ビジー」なのか「邪魔しない」のかはわかりません。

クライアントはPubNub SDKを使用して、特定のチャネルまたはチャネルグループにカスタム状態を設定できます。 一度設定されると、この状態は他のクライアントに伝搬され、状態変更イベントとして受信されます。

{ "channel":"<状態変更に関連するチャネル名>", "uuid":"<ステートが適用されるクライアントのID>" "action":"state-change", "state":{状態を定義するJSONオブジェクト>} "occupancy":3, // チャンネルの占有率 "timetoken":"<状態変更が発生した時>" }。
Enter fullscreen mode Exit fullscreen mode

例えば、このコラボレーションのデモでは、プレゼンス状態を使用して、描画イベントが発生したときにリスナーに通知し、落書きがリアルタイムですべてのビューアーに表示されるコラボレーティブな描画アプリケーションを実現しています。

"state":{"x":5, "y":10, "color": "#FFFFF00"} // 描画イベントの状態ペイロード例  // 描画アプリケーションの状態ペイロードの例
Enter fullscreen mode Exit fullscreen mode

state-changeイベントの唯一の注意点は、永続化されないということです。

プレゼンス管理を使用して受信するイベントを制御する

前述したように、プレゼンスイベントの数は、ユーザが増えるにつれて非常に多くなりがちです。 指定したチャネルで発生するイベントをよりコントロールできるように、セルフサービスの「プレゼンス管理」ツールを導入しました:

プレゼンス管理ツールは、キーセット設定画面の適切なボタンから起動できます:

Portal Configuration: Presence Management

プレゼンス管理ツールは、キーセット設定画面の適切なボタンから起動できます。また、左側のメニューの「BizOpsワークスペース」セクションからツールにアクセスすることもできます。

管理ルールの設定方法の詳細については、プレゼンス管理のドキュメントを参照してください:

  1. アプリケーションにトリガーしたいプレゼンス・イベントを完全に定義するために、複数のルールを持つことができます。
  2. このルールで制御したいイベント(参加、 退出、 タイムアウト、 状態変化間隔など)を指定する。この記事では、これらのルールがどのようなもので、いつ発火するかを説明した。
  3. ワイルドカードパターンを指定して、このルールが適用されるチャネルまたはチャネルグループを定義します。
  4. Create」をクリックし、ルールの適用順序を定義します。

PubNub APIによるプレゼンス管理

PubNubのどのSDKでもプレゼンスイベントを受け取ることができます。この記事では主にSDKイベントリスナーを通して受信されるプレゼンスイベントに焦点を当てましたが、弊社のAPIは特定のチャンネル(here Now)で誰がリスニングしているか、特定のユーザーがどこで購読しているか(where Now)を判断するための追加機能もサポートしています。

JavaScriptでは、hereNow APIを以下のように呼び出すことで、指定したチャンネルに誰が登録されているかを判定できます:

try {
  const result = await pubnub.hereNow({
    channels: ["my_channel"],
    includeState: true,
    includeUUIDs: true
  });
  console.log(total occupancy:  + result.totalOccupancy)
} catch (status) {
  console.log(status);
}
Enter fullscreen mode Exit fullscreen mode

その他のリソース

プレゼンスはPubNubプラットフォームの最も価値のある柔軟な機能の一つです。誰がオンラインであるかを正確に把握し、そのステータスをリアルタイムで更新することで、私たちの顧客は長年にわたっていくつかの魅力的なソリューションを構築することができました。

  • プレゼンス基本ドキュメントはプレゼンスの概念を理解するための良い出発点です。
  • また、プレゼンスイベントのリスナーコールバックを追加する方法を示す API の例については、SDK 固有のドキュメントを参照してください(例:JavaScript SDK のこのページ)。
  • より実践的なチュートリアルとして、ほとんどのチュートリアルにプレゼンスが含まれており、新規開発者にとって良いスタート地点となるのは、いくつかのプログラミング言語をカバーしたチュートリアル「Getting Started」です。 チュートリアルでは、チャンネルで誰が聴いているかを判断するための 'here now' API など、他のプレゼンス機能もカバーします。

最後に、ヘルプやサポートが必要な場合は、お気軽に専用のpubnubサポートチームにご連絡いただくか、開発者リレーションチーム(devrel@pubnub.com)にメールしてください。

PubNubはどのようにあなたを助けることができますか?

この記事はPubNub.comに掲載されたものです。

私たちのプラットフォームは、開発者がWebアプリ、モバイルアプリ、およびIoTデバイスのためのリアルタイムのインタラクティブ性を構築、配信、管理するのに役立ちます。

私たちのプラットフォームの基盤は、業界最大かつ最もスケーラブルなリアルタイムエッジメッセージングネットワークです。世界15か所以上で8億人の月間アクティブユーザーをサポートし、99.999%の信頼性を誇るため、停電や同時実行数の制限、トラフィックの急増による遅延の問題を心配する必要はありません。

PubNubを体験

ライブツアーをチェックして、5分以内にすべてのPubNub搭載アプリの背後にある本質的な概念を理解する

セットアップ

PubNubアカウントにサインアップすると、PubNubキーに無料ですぐにアクセスできます。

始める

PubNubのドキュメントは、ユースケースやSDKに関係なく、あなたを立ち上げ、実行することができます。

Top comments (0)