0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FlutterFlowからFirebase Functionsを呼び出す際にレスポンスが遅い時の対策

Posted at

FlutterFlowからFirebase Functionsを呼び出す際にレスポンスが遅い時の対策

Cloud Functionsはコールドスタート問題が発生することがあり、特に初回実行時に5-15秒程度の遅延が生じることがあります(メモリのサイズによって異なります)。ウォームアップ対策を試してみました。

ウォームアップ対策の手順

1. Cloud Schedulerを使用した定期的なウォームアップ

  1. GCPコンソールで「Cloud Scheduler」にアクセス
  2. 「ジョブを作成」をクリック
  3. ウォームアップ用ジョブの設定:
    • 名前: function-warmup
    • 説明: 「Function warm-up job」
    • 頻度: */10 * * * *(10分ごとに実行)
    • タイムゾーン: 適切なタイムゾーンを選択
    • ターゲットタイプ: HTTP
    • URL: 対象のCloud Function URL
    • HTTPメソッド: GET
    • ヘッダー: {"Content-Type": "application/json"}
    • 認証ヘッダー: 必要に応じて設定
  4. 「作成」をクリック

2. 最小インスタンス数の設定

  1. GCPコンソールで「Cloud Functions」にアクセス
  2. 対象の関数を選択
  3. 「編集」をクリック
  4. 「ランタイム、ビルド、接続設定」を展開
  5. 「ランタイム」タブを選択
  6. 「最小インスタンス数」を1以上に設定(例: 1〜3)
  7. 「次へ」→「デプロイ」をクリック

3. 関数コードの最適化

  1. 関数のパフォーマンスを向上させるコード最適化:
// グローバル変数を活用(関数外で初期化)
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側での対応

  1. FlutterFlowプロジェクトを開く

  2. バックエンドアクションを設定:

    • 「Backend」→「Actions」を選択
    • ウォームアップ用のアクションを作成(必要に応じて並列処理)
  3. アプリ起動時にウォームアップリクエストを送信:

    // アプリ初期化時に実行するコード
    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)');
      }
    }
    
  4. FlutterFlowのカスタムコードセクションに上記コードを追加

  5. アプリの初期画面の「On Page Load」アクションでウォームアップを実行するよう設定

5. Firebase Functionsで直接設定する場合(Blaze計画が必要)

  1. firebase.jsonファイルを編集:

    {
      "functions": {
        "source": "functions",
        "runtime": "nodejs16",
        "minInstances": 1
      }
    }
    
  2. デプロイコマンドを実行:

    firebase deploy --only functions
    

6. リクエストのバッチ処理

  1. 可能な場合、複数のリクエストをバッチ処理:

    • 個別の関数呼び出しをまとめる
    • バルク操作を実装する
  2. 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秒くらいになりました。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?