APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Azure で リアルタイム通信 (websocket)

はじめに

こんにちは。ACS 事業部の奥山です。 Azureでリアルタイム通信処理の検証を行いましたので、備忘録を兼ねてブログにしておきます。

Azureでリアルタイム通信を行う場合の代表的な選択しとしては以下のサービスがあります。

サービス名 利用されるプロトコル
SignalR websocket, long-pooling(comet), etc
IoT Hub mqtt
Web PubSub websocket

※SignalR は他と違い 内部で 複数のプロトコル(websocket, long-pooling)が利用されること、アプリ は 基本的に Azure SDK を利用することになるところが特徴的です。

今回は websocket通信を利用したかったので Azure Web PubSub を利用してみました。

(簡単に)プロトコルとしてのwebsocketとは

wikiによると、HTTPプロトコルとは別モノだけど、HTTPプロトコル上で動くように設計されているとのこと。 ※私はHTTPプロトコル上以外で動いているwebsocketの例を見たことがないです。
ステートレスなHTTPプロトコルに対して、websocketはHTTPのセッションをステートフルに利用して双方向通信を実現します。

具体的な利用例としては、チャットアプリ、リアルタイムの位置情報の追跡、IoTデバイスの監視など。リアルタイム性が必要な比較的小さなメッセージの双方向のやり取りに利用します。
※ 比較的小さなメッセージ ≒ 大きくても数k程度(?) くらいが良いのではないかと思います。
※ Azure Web PubSub のメッセージの最大サイズは1MB。

検証環境の構成

Microsoft が 複数のチュートリアルを用意してくれています。

チュートリアル 備考
チャットアプリを構築する
Azure Functionsで通知アプリを構築する
単純なチャットルームサーバレスアプリケーションを構築する
サブプロトコルを使用したクライアントストリーミング
Azure Functions と Azure Web PubSub サービスを使用してサーバーレスのリアルタイム チャット アプリを作成する 今回はこれを試してみました。
(他にも多数あります)

今回のチュートリアルの内容の説明

今回試したチュートリアルは Azure Functions と Azure AD(認証) を連携させた以下の内容となっています。

※構築の手順はチュートリアルそのままの為、記載しません。

(説明)
1. Browser から /.auth/login/add へアクセスして認証情報(x-ms-client-principal-name) を取得
2. negotiate関数に x-ms-client-principal-name を渡して websocke接続URL を作成
3. Browser が PubSub へ接続
4. Browser から Message送信
5. PubSub から Functionsへ通知(webhook)、message関数 が sendToAll (全クライアント) で PubSub へ通知
6. 接続しているすべてのClient(Browser)でメッセージを受信

(比較) REST vs WebSocket

折角なので少し REST API (POST) と比較してみました。 それぞれに対して 5000回 メッセージ を送信します。メッセージの内容は 約800byte のテキストデータ。テストツール に Gatling を利用し5並列で 1000 request 送信してみました。

結果は以下の通り。5000リクエストの送信にかかった時間は websocket:3秒 と rest api:33秒。
※結果は送信処理にかかった時間です(受信は含まない)。
以下はGatlingのHTML形式のレポート

まとめ

今回は Azure でリアルタイム通信(websocket通信)を行う場合に利用できる Web PubSub の紹介となりました。 Azure Functions や Event Hub と組み合わせることで簡単に利用できるようになっていることも確認できました。

チャットアプリ、IoT、オンラインゲーム、リアルタイム位置情報の追跡 などなどいろいろな用途に活用できます。

リアルタイム通信の方式としては mqtt, grpc など他の選択肢もあります、今回はwebsocket通信(Web PubSub)を利用しましたが、次回以降に mqtt(IoT Hub) なども試してみたいと思います。

最後に

私達ACS事業部はAzure・AKSを活用した内製化のご支援をしております。ご相談等ありましたらぜひご連絡ください。

www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です!
切磋琢磨しながらスキルを向上できる、エンジニアには良い環境だと思います。ご興味を持っていただけたら嬉しく思います。

www.ap-com.co.jp

本記事の投稿者: 奥山 拓弥