当前位置: 首页 > 知识库问答 >
问题:

如何确定firebase云函数间歇性错误的原因

祁正浩
2023-03-14

我有两个不同的云函数,它们偶尔会出现相同的错误。

一个是聚合一些计数器的firestore触发器,另一个是清理旧数据的计划任务。

我似乎看不出错误的任何模式,也没有很多信息。此外,我没有找到很多在这里或与谷歌搜索。它只是偶尔发生,也许每隔几天,或者几个星期,没有错误。它发生的时间大约不到函数运行的2%。

我对firebase和使用async await比较陌生,所以它可能与此相关(async/await)。
以下函数之一的错误和代码。

{ Error
    at Http2CallStream.call.on (/srv/node_modules/@grpc/grpc-js/build/src/client.js:96:45)
    at emitOne (events.js:121:20)
    at Http2CallStream.emit (events.js:211:7)
    at process.nextTick (/srv/node_modules/@grpc/grpc-js/build/src/call-stream.js:71:22)
    at _combinedTickCallback (internal/process/next_tick.js:132:7)
    at process._tickDomainCallback (internal/process/next_tick.js:219:9)
  code: 13,
  details: '',
  metadata: Metadata { options: undefined, internalRepr: Map {} } }
export const clearOldAvailabilityInternal = async () => {
  const limit = 500;
  let vehicleAvailabilityIds: string[] = [];  
  let vehicleTypeAvailabilityIds: string[] = [];
  const now = new Date();
  const twoWeeksAgo = moment(now).subtract(14, "days");

  do {
    vehicleAvailabilityIds = [];
    const batch1 = db.batch();
    const vehicleAvailabilityDocs = await db.collection('vehicleAvailability')
      .where('dateInterval', '<', twoWeeksAgo.toDate())
      .limit(limit)
      .get();

    for (const doc of vehicleAvailabilityDocs.docs) {
      vehicleAvailabilityIds.push(doc.id);
    };
    for(const id of vehicleAvailabilityIds) {
      const deleteRef = db.doc(`vehicleAvailability/${id}`)
      batch1.delete(deleteRef);
    }

    try {
      const result = await batch1.commit();
      console.log('Deleted ' + vehicleAvailabilityIds.length + ' vehicleAvailability documents');
    } catch (err) {
      console.log(err);
      throw err;
    }
  }
  while (vehicleAvailabilityIds.length === limit)

  do {
    vehicleTypeAvailabilityIds = [];
    const batch2 = db.batch();
    const vehicleTypeAvailabilityDocs = await db.collection('vehicleTypeAvailability')
      .where('dateInterval', '<', twoWeeksAgo.toDate())
      .limit(limit)
      .get();

    for (const doc of vehicleTypeAvailabilityDocs.docs) {
      vehicleTypeAvailabilityIds.push(doc.id);
    };
    for(const id of vehicleTypeAvailabilityIds) {
      const deleteRef = db.doc(`vehicleTypeAvailability/${id}`)
      batch2.delete(deleteRef);
    }

    try {
      const result = await batch2.commit();
      console.log('Deleted ' + vehicleTypeAvailabilityIds.length + ' vehicleTypeAvailability documents');
    } catch (err) {
      console.log(err);
      throw err;
    }
  }
  while (vehicleTypeAvailabilityIds.length === limit)

  console.log('clearOldAvailabilityInternal complete');
  return Promise.resolve(true);
}

编辑:

通过捕获错误发生的地方并记录它,我在note字段中获得了更多的细节。“在重试方法中发生了不属于瞬态的异常”,然后我找到了下面的答案。

 { Error
    at Http2CallStream.call.on (/srv/node_modules/@grpc/grpc-js/build/src/client.js:96:45)
    at emitOne (events.js:121:20)
    at Http2CallStream.emit (events.js:211:7)
    at process.nextTick (/srv/node_modules/@grpc/grpc-js/build/src/call-stream.js:71:22)
    at _combinedTickCallback (internal/process/next_tick.js:132:7)
    at process._tickDomainCallback (internal/process/next_tick.js:219:9)
  code: 13,
  details: '',
  metadata: Metadata { options: undefined, internalRepr: Map {} },
  note: 'Exception occurred in retry method that was not classified as transient' }

共有1个答案

许黎明
2023-03-14

似乎是FireStore当前已知的问题。可能使用FirebaseAdminV8。他们正试图解决这一问题,但“可能需要一些时间”。

https://github.com/firebase/firebase-functions/issues/536

2019年8月2日:https://github.com/firebase/firebase-functions/issues/536#issuecomment-517461545

我们的后端团队相信他们知道问题的根本原因,但是要在所有的生产环境中解决这个问题可能需要一段时间。

2019年10月12日:https://github.com/firebase/firebase-functhtml" target="_blank">ions/issues/536#issuecomment-541130536

我们正在继续改进网络堆栈中使用的库,但即使使用最新的@grpc/grpc-js模块,您仍可能遇到偶尔的网络问题。

 类似资料:
  • 我已经编写了一个程序,从usb摄像头捕获图像,并根据检测到的每帧颜色跟踪对象的位置。间歇性(可能在1分钟、10分钟或半小时后发生)我收到错误消息: 我遵循的流程是: 用相机拍摄一帧,cap=cv2。视频捕获(1)/cap。read() 变换几何,cv2。透视图 高斯模糊滤波器,cv2。高斯模糊 BGR到HSV转换,cv2。CVT彩色(模糊帧,cv2.COLOR\u BGR2HSV) 轮廓发现和分析

  • 我们有一个SSL问题,我是99%,这不是你通常的证书信任商店旋转木马。 我们有一个Weblogic服务器试图通过LDAPS与Active Directory建立SSL连接,底层SSL实现是JSSE。 有时,它是有效的。通常在重新启动Weblogic后的几个小时内。 之后,我们开始得到SSL握手错误,与SSL调试打开我们看到: [ACTIVE]ExecuteThread:'10'用于队列:'webl

  • 我已经使用firebase云函数一段时间了,今天在代码中修复了一个小错误,在尝试部署时出现了以下错误。我取消了该更改,并尝试使用上次提交的稳定更改再次部署,但仍然是相同的错误。有什么解决办法吗?PS:这是一个typescript项目,我用tsc编译它。

  • 错误 引用错误:函数未在对象中定义。(C:\用户\CROWDE~1\AppData\本地\Temp\fbfn_9612Si4u8URDRCrr\index.js: 5:21)在模块。_compile(module.js:570: 32)在对象。模块。_extensions... js(module.js:579: 10)在Module.load(module.js:487: 32)在tryModu

  • 我正在编写云函数,Firez是这样自动导入的。 但在部署时,错误如下所示。我试着这样做,它部署没有任何错误,但我不确定这是正确的方式与否。 有人知道吗? node_modules/@googlecloud/firestore/types/firestore。d、 ts:28:15-错误TS2300:重复标识符“DocumentData”。 28导出类型DocumentData={[field: s

  • 我在使用Firebase云函数中的Firebase云消息时遇到一些问题。 错误信息如下。这是从我的Firebase云功能日志控制台。 错误:尝试向FCM服务器进行身份验证时出错。请确保用于验证此SDK的凭据具有适当的权限。 首先,我遵循Firebase Cloud Functions CodeLabs。 https://firebase.google.com/codelabs/firebase-c