Cloud Run Job(google作业) 处理耗时任务
最近使用google cloud的一些服务处理一些事,使用了Cloud Scheduler定时发送http请求大Cloud Function,让Cloud Function定时处理我的事。这个时候会有一个问题:超时。
我的任务比较耗时,任务处理完了返回ok,Cloud Scheduler可能会等不到,认为超时,会重试请求。如果Cloud Function先返回ok,然后再异步处理任务,但是查了下文档,Cloud Function在返回ok后,会在一定时间内自动销毁,也就是异步处理的任务可能还没执行完,函数就被销毁了,导致任务只执行了一部分。
这里将耗时任务调整为了:Cloud Scheduler定时 + Cloud Run Job。
一:本地环境
1:准备:需要一个google cloud 项目。本地安装个Google Cloud CLI,下载地址:https://cloud.google.com/sdk?hl=zh-CN。
2:文件准备,在一个文件夹下面建立3个文件:index.js,Dockerfile,.dockerignore,3个文件位于同一文件夹下。
/您的项目文件夹
├── Dockerfile
└── index.js
└── .dockerignore
index.js:
async function fetchFirestoreData() { console.log("----test-api-test-----"); } async function main() { await fetchFirestoreData(); } main().catch(console.error);
Dockerfile:
# 使用 Node.js 20 官方镜像 FROM node:20
# 更新 npm 到最新版本 # RUN npm install -g npm@latest # 设置工作目录 WORKDIR /usr/src/app # 复制 package.json 和 package-lock.json 文件 COPY package*.json ./ # 安装项目依赖 RUN npm install # 复制项目文件 COPY . . # 启动脚本 CMD ["node", "index.js"]
.dockerignore (如果这个文件夹下有不想部署的文件,可以在这里添加)
# 忽略 node_modules 文件夹
node_modules/
# 忽略不需要的 JS 文件
test.js
# 忽略操作系统生成的文件
.DS_Store
Thumbs.db
# 忽略环境变量配置文件
.env
# 忽略本地构建文件夹
dist/
build/
3:(可选)如果有第3方包:在shell或者cmd中,cd到该文件夹下:
# 初始化 package.json 文件
npm init -y
# 安装 @google-cloud/tasks 和 @google-cloud/bigquery 这里用这两个举例
npm install @google-cloud/tasks @google-cloud/bigquery
二:配置gcloud
1: 需要下载sdk到本地,安装:下载地址:https://cloud.google.com/sdk?hl=zh-CN。
打开Google Cloud SDK Shell:
初始化:
gcloud init
然后按照出现的提示,登录,选择你的google 项目,可以选择位置,比如:us-central1
2:远程配置,在浏览器中登录到google cloud 后。在菜单选择 Artifact Registry,新建一个代码库:
三:上传docker
打开本地Google Cloud SDK Shell:cd 到你的文件夹下, //配置docker,REGION是你刚刚选的代码库的区域 gcloud auth configure-docker REGION-docker.pkg.dev //比如us-central1区域 gcloud auth configure-docker us-central1-docker.pkg.dev //提交docker到远程(不用复制,根据你的项目设置) gcloud builds submit --tag us-central1-docker.pkg.dev/cloud-tes/jobs-docker-repo/taskjobs //us-central1-docker.pkg.dev: 是远程区域 //cloud-tes: 是google 项目id //jobs-docker-repo:是刚刚建的代码库名字 //taskjobs: 远程docker名字 //如果上传的项目变化,通过这个设置切换到新项目:新项目Id: cloud-tes(测试服上传成功后,需要往正式服传时,也可以通过这个切换项目id) gcloud config set project cloud-tes
然后取google cloud后台看看上传的映像:
四:创建作业和定时:
1:创建 Cloud Run Job: 在google cloud后台创建一个job,如图:
2:创建定时任务。创建job完成后,点开刚刚创建的job,选择-》触发器:
五:完成:定时执行耗时任务的功能就ok了。这里的:Cloud Scheduler定时是不需要 Cloud Run Job返回的, Job执行完成后会自动关闭。