是空

駆け出しエンジニアが学んだことをまとめていくブログ

Cloud Functionsのexportsしている関数が2回実行されている件

自分の書いたクソ遅いコードを改善するために、パフォーマンス計測して気が付いた。

「んんんん??2回実行してない?」

コード

const { performance } = require('perf_hooks');

exports.example = async (req, res) => {

  const startTime = performance.now()

  // クソ遅い関数

  const endTime = performance.now();
  console.log(endTime - startTime);

}

コンソール出力

18682.617368996143
18471.702664002776

なんだこりゃ。 ちなみに、ブラウザにレンダリングされた結果は重複していません。

問題を簡略化するために、helloWorldで試してみます。

簡略化コード

let count = 1;

exports.helloWorld = (req, res) => {
  console.log(count)
  if (count === 1) {
    res.send('Hello, World');
  }
  if (count === 2) {
    res.send('Hello, Twice World');
  }
  count += 1;
};

コンソール出力

1
2

ブラウザ

HELLO WORLD
HELLO WORLD

むぅ...。

なぜか?は調査中

確信には至っていませんが、stackoverflowで見た、仕様により複数回実行されることがある、という点からきているのでは、と推測しています。

FYI, Cloud Functions might execute multiple times by design. See this code sample => https://github.com/GoogleCloudPlatform/cloud-functions-reliability-nodejs/blob/master/idempotency/index.js

ionic framework - Firebase Cloud Function executing twice when triggered over HTTP - Stack Overflow

ぜんっぜん確信してませんが...... なんで?誰か助けて。

わかったら追記します。