FlutterFlowからFirebase Functionsを呼び出す際にレスポンスが遅い時の対策
Cloud Functionsはコールドスタート問題が発生することがあり、特に初回実行時に5-15秒程度の遅延が生じることがあります(メモリのサイズによって異なります)。ウォームアップ対策を試してみました。
ウォームアップ対策の手順
1. Cloud Schedulerを使用した定期的なウォームアップ
- GCPコンソールで「Cloud Scheduler」にアクセス
- 「ジョブを作成」をクリック
- ウォームアップ用ジョブの設定:
- 名前:
function-warmup
- 説明: 「Function warm-up job」
- 頻度:
*/10 * * * *
(10分ごとに実行) - タイムゾーン: 適切なタイムゾーンを選択
- ターゲットタイプ:
HTTP
- URL: 対象のCloud Function URL
- HTTPメソッド:
GET
- ヘッダー:
{"Content-Type": "application/json"}
- 認証ヘッダー: 必要に応じて設定
- 名前:
- 「作成」をクリック
2. 最小インスタンス数の設定
- GCPコンソールで「Cloud Functions」にアクセス
- 対象の関数を選択
- 「編集」をクリック
- 「ランタイム、ビルド、接続設定」を展開
- 「ランタイム」タブを選択
- 「最小インスタンス数」を1以上に設定(例: 1〜3)
- 「次へ」→「デプロイ」をクリック
3. 関数コードの最適化
- 関数のパフォーマンスを向上させるコード最適化:
// グローバル変数を活用(関数外で初期化)
const admin = require('firebase-admin');
if (!admin.apps.length) {
admin.initializeApp();
}
const db = admin.firestore();
// 実際の関数
exports.myFunction = async (req, res) => {
try {
// ビジネスロジック
const result = await someProcess();
res.status(200).send({ success: true, data: result });
} catch (error) {
res.status(500).send({ success: false, error: error.message });
}
};
4. FlutterFlow側での対応
-
FlutterFlowプロジェクトを開く
-
バックエンドアクションを設定:
- 「Backend」→「Actions」を選択
- ウォームアップ用のアクションを作成(必要に応じて並列処理)
-
アプリ起動時にウォームアップリクエストを送信:
// アプリ初期化時に実行するコード Future initializeApp() async { // 他の初期化コード // Cloud Functionsのウォームアップ try { await http.get(Uri.parse('https://your-region-your-project.cloudfunctions.net/yourFunction')); print('Function warmed up'); } catch (e) { print('Warm-up request sent (error ignored)'); } }
-
FlutterFlowのカスタムコードセクションに上記コードを追加
-
アプリの初期画面の「On Page Load」アクションでウォームアップを実行するよう設定
5. Firebase Functionsで直接設定する場合(Blaze計画が必要)
-
firebase.json
ファイルを編集:{ "functions": { "source": "functions", "runtime": "nodejs16", "minInstances": 1 } }
-
デプロイコマンドを実行:
firebase deploy --only functions
6. リクエストのバッチ処理
-
可能な場合、複数のリクエストをバッチ処理:
- 個別の関数呼び出しをまとめる
- バルク操作を実装する
-
FlutterFlowのカスタムコードで一括処理を実装:
// 複数のアイテムを一度に処理 Future processBatch(List<String> itemIds) async { final response = await http.post( Uri.parse('https://your-region-your-project.cloudfunctions.net/batchProcessor'), headers: {'Content-Type': 'application/json'}, body: jsonEncode({'items': itemIds}), ); return jsonDecode(response.body); }
注意点
- 最小インスタンス数の設定はコスト増加につながります
- ウォームアップ戦略はユースケースに合わせて調整してください
- Sparkプランでは最小インスタンス数の設定ができないためBlazeプランへのアップグレードが必要です
以上の対策+メモリサイズを1GBにしたら2〜3秒くらいになりました。