LoginSignup
22
14

More than 5 years have passed since last update.

リアルタイムWebアプリにおいてWebSocketを直接つなぐのとFirebaseを挟むのではどの程度レスポンスタイムが変わるか

Posted at

実際に測定してみた。

動機

そこそこリアルタイム性が求められるWebアプリにおいて、できればFirebaseを使いたいが、パフォーマンスが悪くなるならあきらめてWebSocketを直接つなごうと思った。
例えばシムシティのような協力プレイゲームを作っているとして、

  • 自分の操作を他の人に反映させたい
  • お金が足りているかバリデーションをサーバーサイドでやりたい

という場合のことを考えた。

Firebaseを使えたら認証やその他諸々をFirebaseだけで完結させることができる。
しかし、パフォーマンス上成り立たないなら、あきらめてWebSocketを別につなぐことになる。
そこで、実際にどの程度差がつくのか調査してみた。

方法

WebSocket

Dartで下記処理をするサーバーを書く

  • WebSocketを待ち受ける
  • WebSocketから文字が来たら同じ文字を送り返す

Dartで下記処理をするクライアントを書く

  • ブラウザ立ち上げ直後は遅そうなので取り合えず10秒まつ
  • サーバーにWebSocketをつなぐ
  • 100msごとにWebSocketに現在時刻を書き込む
  • WebSocketからさっき書き込んだ時刻が返ってくるので現在時刻から引き算しレスポンスタイムを調べる
  • 以上を100回繰り返し平均を出す

サーバーは

  • GCP asia-northeast1-c
  • 1vCPU
  • 3.75メモリ

僕が日本に住んでるので日本に建てた。
ただし名古屋市民のため、都民だともうちょっと速いかも。

Firebase

Dartで下記処理をするサーバーを書く

  • Firebaseの/requestをListenする
  • /requestに書き込みがあったら同じ内容を/responseにpushする

Dartで下記処理をするクライアントを書く

  • ブラウザ立ち上げ直後は遅そうなので取り合えず10秒まつ
  • Firebaseの/responseをListenする
  • 2s(※)ごとに/requestに現在時刻を書き込む
  • /responseにさっき書き込んだ時刻が書き込まれるので、現在時刻から引き算しレスポンスタイムを調べる
  • 以上を100回繰り返す

(※ 一回100msごとに書き込んで試してみたのだが、イベントが詰まるようで明らかにパフォーマンスが劣化するので間隔を広げた。この点は厳密な比較になっていないので注意)

サーバーは

  • GCP us-central1-c
  • 1vCPU
  • 3.75メモリ

Firebaseがアメリカにあるらしいのでアメリカに建てた。
アメリカのどこにあるのかわからないので、探せばもっと速い場所が見つかるかも。

結果

調査の種類 平均レスポンスタイム (参考)自宅PCにサーバーを立てた場合 
WebSocket 123.66ms 0.93ms
Firebase 254.74ms 440.34ms

感想

意外とWebSocket自体が遅かった。さくらのVPSを使ってた頃は20ms切ってた覚えがある。

ものすごくはっきりした差が出たわけではないので使い方によると思う。

参考情報

簡単にもっとCPUとメモリの多いサーバーで試してみたが、大して変わらなかった。同時接続数がとても低いのであまり関係ないようだ。

22
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
14