PubNubプレゼンスの有効化と設定方法
Published: 2024-05-14 06:58:08

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

  
[![Embedded YouTube Video](https://img.youtube.com/vi/YGrrFUlO_Ys/0.jpg)](https://www.youtube.com/watch?v=YGrrFUlO_Ys)  
[ビデオを見る](https://www.youtube.com/watch?v=YGrrFUlO_Ys)

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

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

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

PubNubのプレゼンス機能を有効にするには、[管理者ポータルに](https://admin.pubnub.com?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)ログインし、プレゼンス機能を有効にしたいアプリとキーセットに移動し、そのキーセットの設定画面でプレゼンススイッチを切り替えます：

![Portal Configuration: Presence Enable](https://www.pubnub.com/cdn/3prze68gbwl1/7oSeiiPIy15BnZhVsZ3FsB/840c751c9826f614a75e00537e5d7967/portal_-_presence_on.png)

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

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

![Portal Configuration: Presence Enable Confirm](https://www.pubnub.com/cdn/3prze68gbwl1/5DOhGhHU4bj028AJecCu83/bacca2c768b2cf2fe25294adf73acdec/portal_-_presence_enable.png)

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

![Portal Configuration: Presence Confirm Changes](https://www.pubnub.com/cdn/3prze68gbwl1/2o4Ftz7WJeD3QA8TWPu9do/09c679b6e94617a702d0095b87d911c4/portal_-_save_changes.png)

アナウンスモード
--------

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

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

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

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

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

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

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

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

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

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

![Portal Configuration: Presence Generate Leave TCP FIN RST](https://www.pubnub.com/cdn/3prze68gbwl1/5wwJWjGkGOs9R0WFWsJgIu/b95da340d8265dab8edc83f69d94e348/portal_-_generate_leave_on_tcp_fin_or_rst.png)

### デバウンス

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

![Portal Configuration: Presence Debounce](https://www.pubnub.com/cdn/3prze68gbwl1/4j08CDBzBT3UOPoTraPoj4/e713d84db1011937c4c26700bc623e78/portal_-_debounce.png)

インターバルモード
---------

### アナウンス最大

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

![Portal Configuration: Presence Announce Max](https://www.pubnub.com/cdn/3prze68gbwl1/5YNhk0OXtAoi9JYG2TpN3H/3ad226821767b7e806f8867806b83e1a/portal_-_announce_max.png)

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

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

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

### インターバル

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

![Portal Configuration: Presence Interval](https://www.pubnub.com/cdn/3prze68gbwl1/6c0nFLx1IzyRD4ky0xoixt/06b7ec3a799b8b15a07e2902019ab7d7/portal_-_interval.png)

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

### プレゼンス・デルタ

![Portal Configuration: Presence Deltas](https://www.pubnub.com/cdn/3prze68gbwl1/13VfH53S8l6KdQ8ap18PUp/0f843d5a9eb2e7cf40fd8c0e51b36d6f/portal_-_presence_deltas_on.png)

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

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

その他の設定
------

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

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

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

![Portal Configuration: Presence Active Notice Channel](https://www.pubnub.com/cdn/3prze68gbwl1/41uqM2t7RZbv7OhYQ0Sdnp/5a7bc69d5bfc4d0c35be69e8f99b1448/portal_-_active_notice_channel_populated.png)

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

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

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

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

ストリームフィルタリングを無効にするオプションは、レガシーな理由から残されています。 ストリームフィルタリングは、プレゼンスチャネルにパブリッシュされたイベントにプレゼンスメタデータを含め、[クライアントフィルタを](https://www.pubnub.com/docs/general/channels/subscribe#message-filters?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)これらのプレゼンスイベントに適用できるようにします。 ストリームフィルタリングを無効にしても、プレゼンスイベントの数が減るわけではなく、クライアントが受信するイベントをフィルタリングできるようになるだけです。

![Portal Configuration: Presence Stream Filtering](https://www.pubnub.com/cdn/3prze68gbwl1/7MVxG7hUQ8T8txFn8ceil2/b7239d86329c74585defe51e15dbb855/portal_-_stream_filtering.png)

### ウェブフック

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

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

これらのWebhookはもはやキーセット設定の一部ではなく、Events & Actions機能に移行された。 Webhookについてはこの記事の範囲では説明しませんが、詳細については、Events & Actionsドキュメントの[Webhook Payloadアクション](https://www.pubnub.com/docs/serverless/events-and-actions/events#webhook-payload?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)セクションを参照してください。

状態の変更
-----

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

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

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

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

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

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

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

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

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

![Portal Configuration: Presence Management](https://www.pubnub.com/cdn/3prze68gbwl1/3L5SZ54NPceHIcBn0hRDIg/9fd5c24690e40a9a05d616acb0900d6d/portal_-_presence_management.png)

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

管理ルールの設定方法の詳細については、[プレゼンス管理のドキュメントを](https://www.pubnub.com/docs/bizops-workspace/presence-management?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)参照してください：

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

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

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

JavaScriptでは、[hereNow APIを](https://www.pubnub.com/docs/sdks/javascript/api-reference/presence?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)以下のように呼び出すことで、指定したチャンネルに誰が登録されているかを判定できます：

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

その他のリソース
--------

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

-   [プレゼンス基本](https://www.pubnub.com/docs/general/presence/overview?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)ドキュメントはプレゼンスの概念を理解するための良い出発点です。
-   また、`プレゼンス`イベントのリスナーコールバックを追加する方法を示す API の例については、SDK 固有の[ドキュメントを](https://www.pubnub.com/docs/general/channels/subscribe?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)参照してください（例：JavaScript SDK の[このページ](https://www.pubnub.com/docs/sdks/javascript/api-reference/publish-and-subscribe#add-listeners?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)）。
-   より実践的なチュートリアルとして、ほとんどのチュートリアルにプレゼンスが含まれており、新規開発者にとって良いスタート地点となるのは、いくつかのプログラミング言語をカバーした[チュートリアル「Getting Started](https://www.pubnub.com/tutorials/getting-started-chat-sdk/?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)」です。 チュートリアルでは、チャンネルで誰が聴いているかを判断するための 'here now' API など、他のプレゼンス機能もカバーします。

最後に、ヘルプやサポートが必要な場合は、お気軽に[専用のpubnubサポート](https://support.pubnub.com/hc/en-us?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)チームにご連絡いただくか、開発者リレーションチーム[（devrel@pubnub.com](mailto:devrel@pubnub.com)）にメールしてください。

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

この記事は[PubNub.comに](https://www.pubnub.com/how-to/admin-portal-presence/?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)掲載されたものです。

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

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

PubNubを体験
---------

[ライブツアーを](https://www.pubnub.com/tour/introduction/?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)チェックして、5分以内にすべてのPubNub搭載アプリの背後にある本質的な概念を理解する

セットアップ
------

[PubNubアカウントに](https://admin.pubnub.com/signup/?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)サインアップすると、PubNubキーに無料ですぐにアクセスできます。

始める
---

[PubNubのドキュメントは](https://www.pubnub.com/docs?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)、ユースケースや[SDKに](https://www.pubnub.com/docs?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)関係なく、あなたを立ち上げ、実行することができます。