如何避免使用Next.js的Firebase上SSR函数导致的初始响应时间慢

wvmv3b1j  于 2023-06-22  发布在  其他
关注(0)|答案(1)|浏览(117)

我们的React应用程序运行在Firebase上。现在我们引入Next.js来改善SEO和初始页面加载时间。SSR(服务器端渲染)由Google Cloud Function第二代(云运行)完成。

    • 问题:**当SSR函数处于冷状态(由Google Cloud发起的部署、空闲、函数崩溃、函数重启导致)时,对我们应用的第一个请求需要等待大约30秒才能得到响应。这太过分了

这30秒包含两个阶段:

  • 2秒:Cloud run功能的冷启动(OK,大概没什么可以改进的)
  • 28秒:Next.js SSR函数(Node.js v18)初始启动(提取所有内容,加载所有模块,我还不知道的事情?)).

只要SSR函数不重新启动,以下所有请求都非常快。
我尝试的是:

  • SSR Cloud function/Cloud run minInstances:1-->问题:Google大约每24小时回收一次示例。结果:第一个请求又变慢了
  • SSR Cloud function/Cloud run minInstances:2-->问题:Google每隔24小时就会在短时间内一个接一个地回收这些示例。用户也打“冷”功能
  • Cloud run HTTP startup probe-->这里我被卡住了,因为我不知道如何配置HTTP startup probe

原因:

  1. Firebase的部署计划:
    firebase experiments:enable webframeworks
    firebase.json
"hosting": {
    "source": ".",
    "frameworksBackend": {
      "region": "europe-west1",
      "minInstances": 1,
      "maxInstances": 1,
      "memory": "1GiB",
      "startupProbe": {
        "httpGet": {
          "path": "/health",
          "port": 8080
        },
        "timeoutSeconds": 240,
        "periodSeconds": 240,
        "failureThreshold": 240,
        "initialDelaySeconds": 0
      }
    },

firebase deploy -P dev
startupProbe参数将被忽略且不部署
1.由于缺少Cloud run函数映像,手动调整现有Cloud run函数失败。部署后会有一些东西清理映像。这个解决方案只是暂时的,用来测试http startupProbe是否能解决我的问题。
未找到映像“europe-west1-docker.pkg.dev/PROJECT/gcf-artifacts/ssrPROJECTdev:version_1”。

mzaanser

mzaanser1#

1.由于缺少Cloud run函数映像,手动调整现有Cloud run函数失败。Something*1在部署后清理映像。这个解决方案只是暂时的,用来测试http startupProbe是否能解决我的问题。未找到映像“europe-west1-docker.pkg.dev/PROJECT/gcf-artifacts/ssrPROJECTdev:version_1”。
未找到映像“europe-west1-docker.pkg.dev/PROJECT/gcf-artifacts/ssrPROJECTdev:version_1”。
我找到了原因。Firebase工具会在成功部署后清理映像。手动禁用此步骤:

  • https://github.com/firebase/firebase-tools/blob/master/src/deploy/functions/release/index.ts#L93
  • 在本地安装npm install -g firebase-tools时:node/v18.15.0/lib/node_modules/firebase-tools/lib/deploy/functions/release/index.js:68

取消注解这行代码,firebase函数部署后镜像不会被清理:
await containerCleaner.cleanupBuildImages(haveEndpoints, deletedEndpoints);
之后,我可以在Google Cloud Web GUI https://console.cloud.google.com/run/deploy/{region}/{functionName}?project={projectName}中或使用gcloud clistartupProbe从默认TCP更改为HTTP。

仍有疑问:如何直接在firebase.json中配置startupProbe,如原始问题中所述。

相关问题