このところMicrosoft Azureの製品の一つであるAzure Web PubSubをいろいろ試していて、普通のWebSocketサーバーとして使えることを確認できたので気づいた点をメモとして残しておきます。2024年9月現在の話です。
公開されているJavaScript用ライブラリはNode.js用
ブラウザとAzure Web PubSubの通信はWebSocket APIで行えるため専用のライブラリは必要ありません。
Azure Web PubSubのJavaScript用クライアントライブラリとしてマイクロソフトはWeb PubSub client library for JavaScriptを公開しています。
- Web PubSub client library for JavaScript
- @azure/web-pubsub-client - npm
- @azure/web-pubsub-client package | Microsoft Learn
このライブラリはNode.js(およびその互換環境)向けで、ブラウザでは動きません。
サブプロトコルは要指定
専用のライブラリは必要ないのですが、Azure Web PubSubの用意する専用サブプロトコルは指定必須と言えます。
WebSocketにはカスタムの通信ルールと規約を定義できるサブプロトコルという機能があります。サブプロトコルはWebSocket()コンストラクタの第2引数で指定できます。
Azure Web PubSubは専用サブプロトコルとして次の二つを用意しています。
json.webpubsub.azure.v1
(JSONで通信する場合)protobuf.webpubsub.azure.v1
(Protocol Buffersで通信する場合)
Azure Web PubSubはこの専用サブプロトコルを指定したクライアントを「PubSub WebSocketクライアント」、指定しないクライアントを「シンプルWebSocketクライアント」と規定しています。
この説明からだとシンプルWebSocketクライアントでも普通に使えるように思えるのですが、2024年9月現在シンプルWebSocketクライアントにはエラーが発生したとき情報を十分把握できないという問題があります。
たとえば私には解決できていない現象として次があります。専用サブプロトコルを指定しないシンプルWebSocketクライアントでWebSocket: send() メソッドを呼び出すとただちにWebSocket: close イベントが送信されて切断してしまうのです。引数のCloseEventを見るかぎりCloseEvent: code プロパティの値は 1000
(通常のクローズ)で、この値からは処理は正常に行われたとしか考えられません。Azure Web PubSubはPubSub WebSocketクライアントからのアクセスを前提としていて、シンプル WebSocket クライアントからのアクセスに対しては十分な対応ができていないということのように思えます。
PubSub WebSocketクライアントはシンプルWebSocketクライアントよりも高度な機能が使えます。その高度な機能が必要か、あったほうがよいかはユースケースによると思いますが、製品の性格から言っても、シンプルWebSocketクライアントでなければならないという強い理由がなければPubSub WebSocketクライアントを選択する(=専用サブプロトコルを指定する)のが無難かと思います。
サブプロトコル指定時はグループへの参加が必要
サブプロトコルを指定してAzure Web PubSubに接続したらまずグループに参加させましょう。
Azure Web PubSubはクライアントの接続をグループという単位で管理します。
PubSub WebSocketクライアントはメッセージの送信をグループに対して行うアーキテクチャになっているため、PubSub WebSocketクライアントを利用する際はグループへの参加は必須です。type: "joinGroup"
のメッセージを送信するとグループに参加できます。
AzureポータルのクライアントURLジェネレーターはハブの入力に注意
AzureポータルのクライアントURLジェネレーターを利用する際はまず「ハブ」の入力フィールドを確認、基本ラテン以外の文字が設定されていたら英文字で更新するようにしましょう。
Azure Web PubSubアクセスにはURLに認証用アクセストークンが必要で、一般的なユースケースではWeb APIを別途用意して発行することになりますが、Azureポータルは試験用等の一時的な利用に使えるクライアントURLジェネレーターを提供しています。
しかしこのAzureポータルのクライアントURLジェネレーター、多言語対応が十分でなく、言語・地域設定で日本語を選択していると初期状態で「ハブ」の入力フィールドにカタカナで ハブ
と設定されます。ハブとして指定可能な文字種は英大文字・小文字に数字、若干の記号(,._\
)だけであるにもかかわらず、です。その上初期状態ではエラーも表示されず、クライアントURLも生成できてしまいます(生成したクライアントURLを指定して接続しようとするとエラーになります)。
最後に
とまあいくつか気をつける点はありますが、WebSocketサーバーを自分で管理するより圧倒的にお手軽なのはまちがいありません。WebSocket APIを使ったWebSocketサーバーアクセスは簡単に実装できるので、クライアント間のリアルタイムコミュニケーションでなにかアイディアのある方はAzure Web PubSubを使って実現してみてはいかがでしょうか。