Javascript Google云函数错误-PubSub到BigQuery
我创建了一个带有Pub/Sub触发器(由Stackdriver接收器触发)的Google云函数。然后,它更改此数据的格式并将其保存到BigQueryJavascript Google云函数错误-PubSub到BigQuery,javascript,google-cloud-platform,google-bigquery,google-cloud-functions,Javascript,Google Cloud Platform,Google Bigquery,Google Cloud Functions,我创建了一个带有Pub/Sub触发器(由Stackdriver接收器触发)的Google云函数。然后,它更改此数据的格式并将其保存到BigQuery const {BigQuery} = require('@google-cloud/bigquery'); const bigquery = new BigQuery(); const environment= process.env.ENVIRONMENT || 'Dev'; insertIntoBigQueryClient = async
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();
const environment= process.env.ENVIRONMENT || 'Dev';
insertIntoBigQueryClient = async (locationObject) => {
const metadata = locationObject.jsonPayload.metadata;
const row = [{
driverId: metadata.driverId,
driverPhone: metadata.driverPhone,
driverStatus: metadata.driverStatus,
driverLocation: metadata.driverLocation.coordinates,
timestamp: locationObject.timestamp
}];
// Insert data into a table
return await bigquery
.dataset(`YassirBackendLogging${environment}`)
.table('DriverLocationStatus')
.insert(row);
};
driverLocationStatusProcessing = async (pubSubEvent, context) => {
try {
const logObject = JSON.parse(Buffer.from(pubSubEvent.data, 'base64').toString());
insertIntoBigQueryClient(logObject);
} catch(error){
console.error(error);
}
};
// this part is only to have multi functions. one for each envirenment
switch (environment) {
case 'Prod' :
exports.driverLocationStatusProcessingProd = async (pubSubEvent, context) => {
await driverLocationStatusProcessing(pubSubEvent, context);
};
break;
case 'Dev' :
exports.driverLocationStatusProcessingDev = async (pubSubEvent, context) => {
await driverLocationStatusProcessing(pubSubEvent, context);
};
break;
default :
exports.driverLocationStatusProcessingDev = async (pubSubEvent, context) => {
await driverLocationStatusProcessing(pubSubEvent, context);
};
break;
}
这是云构建代码
steps:
- name: 'gcr.io/cloud-builders/gcloud'
args:
- functions
- deploy
- 'driverLocationStatusProcessing$_ENVIRONMENT'
- '--set-env-vars'
- ENVIRONMENT=$_ENVIRONMENT
- '--trigger-topic'
- 'DriverLocationStatus$_ENVIRONMENT'
- '--runtime'
- nodejs8
- '--timeout=540'
dir: 'driver-location-status'
现在,这个函数工作得很好,但有时会出现一些错误。例如:
错误:无法加载默认凭据。浏览以了解更多信息。
位于GoogleAuth.getApplicationDefaultAsync(/srv/node_modules/google auth library/build/src/auth/GoogleAuth.js:161:19)
在
在进程中。_tickDomainCallback(internal/process/next_tick.js:229:7)
错误:函数在请求范围外崩溃
无法执行此函数
我希望我能得到一些关于这件事的反馈。可能与异步任务有关 这看起来像是
driverLocationStatusProcessing
函数中的潜在逻辑错误:
试试看{
...
返回insertIntoBigQueryClient(logObject);
//^^添加返回语句
我不确定这是否是您的问题的原因,但您的评论指出了潜在的竞争条件(“它像百万分之一的情况发生”),如果没有return
,wait
,它将不会做您期望的事情
这也可能与此相关:这看起来像是
驱动器位置StatusProcessing
功能中的潜在逻辑错误:
试试看{
...
返回insertIntoBigQueryClient(logObject);
//^^添加返回语句
我不确定这是否是您的问题的原因,但您的评论指出了潜在的竞争条件(“它像百万分之一的情况发生”),如果没有return
,wait
,它将不会做您期望的事情
这也可能与此相关:1)绝不允许您的代码在云函数中崩溃。始终实现try/catch和错误处理逻辑。2)无法加载凭据可能是一个网络问题(暂时的Google问题)或者代码中存在逻辑问题。2)我会修改代码以直接获取ADC凭据并验证它们。如果凭据无效,请退出。发布/订阅将稍后重试。3)编写代码以假设失败并处理失败、重试、超时等。这将帮助您更好地了解问题的根源。4)Node.js非常流行ar但我不会在Node.js.Go中编写云函数,Python使程序更简单,更易于调试(我在编写了数千个函数后的观点)。我解决了未经处理的拒绝问题。但考虑到凭证问题,这不是一个代码问题。它像百万分之一的事件一样发生,但它确实困扰着我。因为我负担不起丢失数据。我希望有一种解决方法。我提供了关于如何处理此问题的建议(第2项和第3项)。请记住,捕获错误与设计逻辑以检测错误并从错误中恢复不同。好的,谢谢你的建议。它们非常有用。我现在单独处理错误,似乎问题并不真正存在于我的代码中。在我修改了其中一个函数的内存参数并添加了修复nu之后实例数增加到50。问题解决了。我总共有5个函数。2个函数每3秒执行一次,其他的每秒执行200次。所以我测试了我的理论,它成功了。你怎么看?1)永远不要让你的代码在云函数中崩溃。始终实现try/catch和错误处理逻辑。2)无法load凭据可能是网络问题(暂时的Google问题)或者代码中存在逻辑问题。2)我会修改代码以直接获取ADC凭据并验证它们。如果凭据无效,请退出。发布/订阅将稍后重试。3)编写代码以假设失败并处理失败、重试、超时等。这将帮助您更好地了解问题的根源。4)Node.js非常流行ar但我不会在Node.js.Go中编写云函数,Python使程序更简单,更易于调试(我在编写了数千个函数后的观点)。我解决了未经处理的拒绝问题。但考虑到凭证问题,这不是一个代码问题。它像百万分之一的事件一样发生,但它确实困扰着我。因为我负担不起丢失数据。我希望有一种解决方法。我提供了关于如何处理此问题的建议(第2项和第3项)。请记住,捕获错误与设计逻辑以检测错误并从错误中恢复不同。好的,谢谢你的建议。它们非常有用。我现在单独处理错误,似乎问题并不真正存在于我的代码中。在我修改了其中一个函数的内存参数并添加了修复nu之后从实例数到50个。问题解决了。我总共有5个函数。2个函数每3秒执行一次,其他的每秒执行200次。所以我测试了我的理论,它成功了。你觉得怎么样?哦,真的谢谢你。我忘了返回。但是即使没有返回,在将内存从256MB增加到1GB之后实例数增加到50,我完全解决了这个问题。但我想我会再次减少内存并添加return语句,看看会发生什么。你觉得怎么样?ohhh非常感谢。我忘记了返回。但是即使没有返回,在将内存从256MB增加到1GB,实例数增加到50之后,我完全解决了这个问题。但我想我会再次减少内存并添加return语句,看看会发生什么。你怎么看?