我有一个(GCP)云功能,用于汇总每小时数据并写入Cloud Bigtable,但是在返回完整的消息之前,它似乎返回了一条消息:“函数执行耗时100ms,状态为ok”代码,随后的行有时会运行,有时却不会。如果有人有任何经验并可以就此提供建议,那就太好了!
当我运行脚本时,它仅在Cloud Functions中可在我的本地计算机上运行,我不确定是什么触发了代码的终止。我尝试添加一个try / catch块,但是它也没有引发任何错误。该代码的主要部分复制如下:
const Bigtable = require('@google-cloud/bigtable');
const bigtableOptions = { projectId: process.env.PROJECT_ID };
const bigtable = new Bigtable(bigtableOptions);
const cbt = bigtable.instance(process.env.BIGTABLE_INSTANCE);
const async = require("async");
const moment = require("moment");
require("moment-round");
const bigtableFetchRawDataForDmac = require("./fetchData").bigtableFetchRawDataForDmac;
exports.patchJob = (event, context) => {
const pubsubMsg = Buffer.from(event.data, 'base64').toString();
const jsonMsg = tryParseJSON(pubsubMsg); // msg in format { time: "2018-12-24T02:00:00.000Z", dmac: ["abc", "def", "ghi] }
if(!jsonMsg) return;
else {
if(!jsonMsg.time) {
console.log("Time not provided");
// res.status(400).json({ err: 'TimeNotProvided', msg: `Time parameter is not provided` });
return;
}
let date_range = {};
date_range.lower = moment(jsonMsg.time).toISOString();
date_range.upper = moment(jsonMsg.time).add(1,'hours').subtract(1,"milliseconds").toISOString();
let queryData = [];
let data = {};
for(let i=0; i<jsonMsg.dmac.length; i++){
data[jsonMsg.dmac[i]]=[];
queryData.push(bigtableFetchRawDataForDmac(cbt, jsonMsg.dmac[i], date_range.lower, date_range.upper, data[jsonMsg.dmac[i]]));
}
async.parallel(queryData, function(err, result){
console.log("cookie trail...");
return;
}
}
}
对于bigtableFetchRawDataForDmac,它位于另一个文件夹中:
function bigtableFetchRawDataForDmac(cbt, dmac, start, end, data) {
return async function(cb){
const table = cbt.table(process.env.BT_DATA_TABLE);
try { var bigtable = await fetchFromBigtable(table, process.env.BT_DATA_TABLE, dmac, start, end, data, ['push', 'mode', 'val']); }
catch (err) { console.log("bigtableFetchRawDataForDmac failed: ", err); cb(err); }
}
}
答案 0 :(得分:1)
pubsub Cloud Function接收一个event
和callback
参数。完成所有工作后,您应该将回调方法调用到terminate the function,所有类型的background Cloud Functions都是这种情况。
您已调用回调context
。而且您根本没有使用它来终止功能。您也可以返回一个诺言,当所有工作完成后,诺言便会解决,但是您也不这样做。
您将不得不找出一种方法,仅在所有异步工作完成后才能正确终止函数,否则它将无法按您期望的方式工作。
答案 1 :(得分:0)
在Nodejs 8(Beta)运行时中,应提供3个参数(数据,上下文,回调),而不是Cloud Functions控制台的内联编辑器中默认模板中提供的2个参数。 (文档参考: https://cloud.google.com/functions/docs/writing/background#functions_background_parameters-node8)。
代码应类似于:
exports.patchJob = (event, context, callback) => {
doSomething();
callback(); // To terminate Cloud Functions
}
感谢@Doug的提示!