次の方法で共有


クライアントからのイベント通知

「クイックスタート」の最初の 3 つの記事では、Web PubSub を使用して大規模 (100 万以上) なリアルタイム メッセージングを行うための 2 つの便利な通信パターンを学習しました。

  • 永続的な接続を管理する複雑さからアプリケーション サーバーを解放するクライアント間の Pub/Sub
  • 新しいデータが使用可能になるとすぐに行われるアプリケーション サーバーからクライアントへのメッセージのプッシュ

このクイックスタート ガイドでは、次の場合などにアプリケーション サーバーがイベントに応答できるように、Web PubSub のイベント システムについて説明します

  • クライアントが connected である
  • クライアントが message を送信し、これによりさらに処理が必要になる

クライアント イベントを受信するアプリケーション サーバーの GIF。

重要

この記事では、デモ目的でのみ生の接続文字列が表示されます。

接続文字列には、アプリケーションが Azure Web PubSub サービスにアクセスするために必要な認可情報が含まれています。 接続文字列内のアクセス キーは、サービスのルート パスワードに似ています。 運用環境では、常にアクセス キーを保護してください。 Azure Key Vault を使ってキーの管理とローテーションを安全に行い、WebPubSubServiceClient を使って接続を保護します

アクセス キーを他のユーザーに配布したり、ハードコーディングしたり、他のユーザーがアクセスできるプレーンテキストで保存したりしないでください。 キーが侵害された可能性があると思われる場合は、キーをローテーションしてください。

前提条件

アプリケーションを作成する

Web PubSub は、アプリケーション サーバーへのスタンドアロン サービスです。 アプリケーションは従来の HTTP サーバーとしての役割を保持しますが、Web PubSub は、アプリケーション サーバーとクライアント間で渡されるリアルタイム メッセージを処理します。 最初にクライアント プログラムを作成し、次にサーバー プログラムを作成します。

クライアントを作成する

1. クライアント アプリのディレクトリを作成する

mkdir eventHandlerDemo
cd eventHandlerDemo

# The SDK is available as an NPM module.
npm install @azure/web-pubsub-client

2. Web PubSub に接続する

クライアント (ブラウザー、モバイル アプリ、または IoT デバイス) では、クライアント アクセス URL を使用してリソースに接続して認証します。 この URL は、wss://<service_name>.webpubsub.azure.com/client/hubs/<hub_name>?access_token=<token> のパターンに従います。 クライアントには、クライアント アクセス URL を取得するいくつかの方法があります。 このクイック スタートでは、次の図に示す Azure portal からコピーして貼り付けることができます。 コードでクライアント アクセス URL をハード コーディングしないことをお勧めします。 運用環境では、通常、この URL をオンデマンドで返すようにアプリ サーバーを設定します。 「クライアント アクセス URL を生成する」で手順について詳しく説明します。

この図には、クライアント アクセス URL を取得する方法が示されています。

client.js という名前のファイルを作成し、次のコードを追加します

const { WebPubSubClient } = require("@azure/web-pubsub-client");
// Instantiates the client object 
// <client-access-url> is copied from Azure portal mentioned above.
const client = new WebPubSubClient("<client-access-url>");

// Registers a handler to the "connected" event
client.on("connected", (e) => {
  console.log(`Connection ${e.connectionId} is connected.`);
});

// You must invoke start() on the client object 
// to establish connection with your Web PubSub resource
client.start();

アプリケーション サーバーを作成する

1. express.js と Web PubSub サーバー SDK をインストールする

npm init -y
npm install --save express

# Installs the middleware from Web PubSub. This middleware will set up an endpoint for you.
npm install --save @azure/web-pubsub-express 

2. 空の express アプリを設定する "server.js" という名前の新しいファイルを作成する

const express = require("express");

const app = express();

app.listen(8080, () => console.log('Server started, listening on port 8080'));

3. イベントを処理する

Web PubSub では、クライアント側で特定のアクティビティが発生した場合 (たとえば、クライアントが Web PubSub リソースと connected または disconnected の場合)、アプリケーション サーバーで、これらのイベントに対応するハンドラーを設定できます。

2 つの重要なユース ケース:
  • クライアントが接続されている場合は、接続されているすべてのクライアントにこの状態をブロードキャストできます
  • クライアントが Web PubSub リソースにメッセージを送信するときに、任意のデータベースにメッセージを保持できます
const express = require("express");
const { WebPubSubEventHandler } = require("@azure/web-pubsub-express");

const app = express();

const HUB_NAME = "myHub1";

let handler = new WebPubSubEventHandler(HUB_NAME, {
  path: '/eventhandler', // Exposes an endpoint 
  onConnected: async (req) => {
    console.log(`${req.context.userId} connected`);
  }, 
});

// Registers the middleware with the express app
app.use(handler.getMiddleware());

app.listen(8080, () => console.log('Server started, listening on port 8080'));

上記のコードで構成したように、クライアントが Web PubSub リソースに接続すると、Web PubSub により、パス /eventhandler でアプリケーション サーバーから提供される Webhook が呼び出されます。 ここでは、ユーザーが接続しているときに userId をコンソールに出力するだけです。

ローカルホストを公開する

プログラムを実行します。これはポート 8080localhost 上で実行されます。 ここでは、インターネット上でローカル express アプリに到達できないことになります。 そのため、Web PubSub で、パス /eventhandler で提供される Webhook を呼び出すことができません。

localhost にトラフィックをルーティングする方法は 2 つあります。1 つは、ngrokTunnelRelay などのツールを使用して、インターネット上でアクセスできるように localhost を公開することです。 もう 1 つの方法 (推奨される方法でもある) は、awps-tunnel を使用し、ツールを介して Web PubSub サービスからローカル サーバーにトラフィックをトンネリングすることです。

1. awps-tunnel をダウンロードしてインストールする

このツールは、Node.js バージョン 16 以降で実行されます。

npm install -g @azure/web-pubsub-tunnel-tool

2. サービス接続文字列を使って実行する

この記事では、デモ目的でのみ生の接続文字列が表示されます。 運用環境では、常にアクセス キーを保護してください。 Azure Key Vault を使ってキーの管理とローテーションを安全に行い、WebPubSubServiceClient を使って接続を保護します

export WebPubSubConnectionString="<your connection string>"
awps-tunnel run --hub myHub1 --upstream http://localhost:8080

Web PubSub リソースでイベント ハンドラーを設定する

ここで、この Webhook URL について Web PubSub リソースに通知する必要があります。 イベント ハンドラーは、Azure portal または Azure CLI から設定できます。

  1. メニューから [設定] を選択して、[追加] を選択しますAzure Web PubSub イベント ハンドラーの構成 - メニューのスクリーンショット。

  2. ハブ名を入力します。 ここでは、「myHub1」と入力し、[追加] を選択します

  3. イベント ハンドラー ページで、次のフィールドを構成します。awps-tunnel ツールを使用する場合、URL テンプレートでは、tunnel スキームの後にパスが使用されます: tunnel:///eventhandlerAzure Web PubSub イベント ハンドラーの構成 - 詳細のスクリーンショット。

  4. 構成を保存しますAzure Web PubSub イベント ハンドラーの構成 - 保存のスクリーンショット。

プログラムを実行する

アプリケーション サーバーを起動する

node server.js

クライアント プログラムを起動する

node client.js

結果を観察する

コンソールに userId が出力されていることがわかります。

メッセージ イベントを処理する

クライアントからは、connectconnecteddisconnected などのシステム イベントのほかに、カスタム イベントも送信できます。

クライアント プログラムを変更する

クライアント プログラムを停止し、次のコードを client.js に追加します

// ...code from before

client.start();

// The name of the event is message and the content is in text format.
client.sendEvent("message", "sending custom event!", "text");

サーバー プログラムを変更する

クライアント プログラムを停止し、次のコードを server.js に追加します

// ... code from before

let handler = new WebPubSubEventHandler(HUB_NAME, {
  path: "/eventhandler",
  onConnected: async (req) => {
    console.log(`"${req.context.userId}" is connected.`);
  },
  // This handler function will handle user system
  handleUserEvent: async (req, res) => {
    if (req.context.eventName === "message") {
      console.log(`Received message: ${req.data}`);
      // Additional logic to process the data,
      // e.g save message content to database 
      // or broadcast the message to selected clients.
    }
  },
});

//... code from before

クライアント プログラムとサーバー プログラムをもう一度起動する

userIdReceived message: sending custom event! の両方がコンソールに出力されていることがわかります。

まとめ

このチュートリアルでは、イベント システムが Web PubSub でどのように機能するかについての基本的な説明を行いました。 実際のアプリケーションでは、イベント システムは、システムとユーザーによって生成されたイベントを処理するためのロジックをより多く実装する場合に役立ちます。

次のステップ