見出し画像

TypeScript & React & Firebase で何かつくってみる14 Firebase改善失敗

ときどき応答が悪いのが気になってきた. そこでレスポンス速度改善の手立てを探してみたが, 結論を言えばあまり収穫はなかった.

Cloud Functions のメモリ割り当て量を増やす

以前どこかで見た メモリ割り当て増量による性能改善を試す.

上に書いてある「ソースコードから変更する方法」を試す.

functions/src/index.ts

const runtimeOption: functions.RuntimeOptions = {
 memory: '2GB'
}
export const handleAction = functions
    .region('asia-northeast1')
    .runWith(runtimeOption)
    .firestore.document('actions/{actionId}').onCreate(...

以前 リージョンを指定した場所に runWith() を挿入してパラメータを渡す.
最大は2GB らしいのでそれを指定してコミット.

Firebase Console で設定されていることを確認する.

FireShot Capture 028 - card-game-field - Firebase コンソール - console.firebase.google.com

・・・まぁ多少効果あった? ような? これまで ログで良い時 300ミリ秒前後だったものが 200ミリ秒切るくらいになった.

だが, 今気にしているのは悪い時だ.
何回かに一回は 1秒以上かかるときがある.
そもそも大した計算をしているわけでない.

ボトルネックは計算速度じゃない. じゃあなんだ.

トランザクションまわり

トランザクションまわりをもっと効率的に書くべきかと思い, いろいろ調べたり コードをいじったりするも期待する成果は得られず.

上記記事を書かれている方の知識は半端じゃない. おいおい投稿記事一通り目を通したほうがいいだろう.

ドキュメント更新は1秒に1回?

で. @1amageek 氏のQiita記事をいくつか見ていたところ不穏な言葉があった.

Cloud Firestoreはドキュメントへの最大書き込み速度が1秒あたり1回と言う制限を持っていました。

いや,正直に言えば 以前から目の端には止まっていた言葉だ.
公式の使用制限だって ざっとは見たことがある.

FireShot Capture 029 - 使用量と制限  -  Firebase - firebase.google.com

しかし実際に使っていて 1秒に1回とはとても思えない. 

言葉通りでない深い意味があると捉えていたが, やはり 単に「1秒に1回しか書き込めない」と言ってるようにしか見えない.

あるいは「平均すると1秒に1回」のような意味だろうか. 本当は「10秒に10回」とか「100秒に100回」のようにやや柔軟に制限しているとか.

実験する.
クリック1回で53枚のカードを裏返してみる. もちろん1つずつ別コマンドだ.全部裏返るのに何秒かかるかストップウォッチで計る.

画像3

(あれ? GIFアニメバグってる?)
ざっと8秒かかった. 平均150ms/枚
まぁこれまでの経験から考えれば遅くはない.

カード枚数を2倍にして再実験.

画像4

10秒過ぎたあたりから動かない.

ずっと待っていると1分20秒過ぎたあたりから徐々に復帰してきた. 全部裏返すのに1分24秒かかった. 平均だと800ms/枚 くらいか.

Firebase Console のログにもいつか見たエラーが出ている.

Error: quota exceeded (Quota exceeded for quota group 'FunctionCallsNonbillable' and limit 'Function invocations per 100 seconds' of service ...

あやうくゴッチャにするところだったが, このエラーは多分 Cloud Functions の制限だ. 先の話は Firestore なので区別せねば.

この文書に該当しそうな制限はない・・・ように見えるが自身がない.
このあとも何度か実験をしていると別のエラーも出た.

 Error: quota exceeded (Quota exceeded for quota group 'DNSResolutionsNonbillable' and limit 'DNS resolutions per 100 seconds' of service ...
Error: quota exceeded (Quota exceeded for quota group 'CPUMilliSecondsDailyNonbillable' and limit 'CPU allocation in function invocations per day' of service...

どれもメッセージ中に "to increase quotas, enable billing in your project" (増やしたかったら課金してね) と書いてあるので無料の制限か.

もっといろいろ試したいが, この実験はあっという間にいろいろな制限にひっかかってしまうため うまくいかない.

時間をかけた割に収穫は乏しい. まぁ多少は勉強になった.
別のアプローチでなんとかする方法を考えねば.

この記事が気に入ったらサポートをしてみませんか?