【问题标题】:Spurious MaxListenersExceededWarning EventEmitter memory leak when running consecutive firestore queries运行连续的 Firestore 查询时出现虚假 MaxListenersExceededWarning EventEmitter 内存泄漏
【发布时间】:2020-01-15 16:53:03
【问题描述】:

我有一个 firebase HTTP 函数,它依次调用一些 firestore 操作。如果我多次调用 HTTP 函数,让每次调用在调用下一次之前完成,我会在 firebase 函数日志中收到以下错误:

(node:2) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 close listeners added. Use emitter.setMaxListeners() to increase limit

firebase 函数是一个导入任务,它将数据导入,通过调用 firestore 查询检查重复项,如果没有,则通过另一个 DB 操作将数据添加到 firestore 数据库。

这里是 firebase 函数,为简洁起见删除了部分:

module.exports = functions.https.onCall(async (obj, context) => {
  // To isolate where the problem is
  const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms))
  try {
    const photo = getPhoto(obj)
    // Query to look for duplicates
    const query = db
      .collection(`/Users/${context.auth.uid}/Photos`)
      .where('date', '==', photo.date)
      .where('order', '==', photo.order)
      .limit(1)

    await wait(300)
    log.info('Before query')
    const querySnap = await query.get()
    log.info('After Query')
    await wait(300)

    // And then the rest of the code, removed for brevity
  } catch (error) {
    throw new functions.https.HttpsError('internal', error.message)
  }
})

我在 const querySnap = await query.get() 之前和之后插入了一个暂停,以表明确实是这个调用导致了错误消息。

我还将 Firestore 记录器设置为输出其内部日志记录以帮助调试问题,方法是:

import * as admin from 'firebase-admin'
admin.initializeApp()
admin.firestore.setLogFunction(log => {
    console.log(log)
})

所以我得到的更完整的日志输出是这样的:(从下到上阅读)

12:50:10.087 pm: After Query
12:50:10.087 pm: Firestore (2.3.0) 2019-09-13T19:50:10.087Z RTQ7I [Firestore._initializeStream]: Received stream end
12:50:10.084 pm: Firestore (2.3.0) 2019-09-13T19:50:10.084Z RTQ7I [Firestore._initializeStream]: Releasing stream
12:50:10.084 pm: Firestore (2.3.0) 2019-09-13T19:50:10.084Z RTQ7I [Firestore.readStream]: Received response: {"document":null,"transaction":{"type":"Buffer","data":[]},"readTime":{"seconds":"1568404210","nanos":76771000},"skippedResults":0}
12:50:10.026 pm: (node:2) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 close listeners added. Use emitter.setMaxListeners() to increase limit
12:50:10.020 pm: Firestore (2.3.0) 2019-09-13T19:50:10.020Z RTQ7I [Firestore.readStream]: Sending request: {"parent":"[redacted]/documents/Users/SpQ3wTsFzofj6wcsF7efRrSMrtV2","structuredQuery":{"from":[{"collectionId":"Photos"}],"where":{"compositeFilter":{"op":"AND","filters":[{"fieldFilter":{"field":{"fieldPath":"date"},"op":"EQUAL","value":{"stringValue":"2019-06-26"}}},{"fieldFilter":{"field":{"fieldPath":"order"},"op":"EQUAL","value":{"integerValue":0}}}]}},"limit":{"value":1}}}
12:50:10.019 pm: Firestore (2.3.0) 2019-09-13T19:50:10.019Z RTQ7I [ClientPool.acquire]: Re-using existing client with 100 remaining operations
12:50:10.012 pm: Before query

有趣的是,我通常以 10 个批次运行这些导入。我似乎只在第一批 10 个期间收到错误。如果我随后快速运行更多批次,我似乎不会再次收到错误.但是,如果我等待一段时间,它会返回。此外,在批次内的哪个调用中发生错误并不一致。它可能是第 9 次或第 2 次或调用,或任何其他。

最后,错误并没有停止执行。事实上,进口似乎永远不会失败。但是,我不喜欢在我的日志中发现错误!晚上和他们在一起,我将无法入睡。 :-)

感谢您提供的任何帮助。

【问题讨论】:

  • 该消息来自 nodejs,而不是 Firestore SDK。不过,我认为您可能想向 Firebase 支持提出问题。 support.google.com/firebase/contact/support
  • 谢谢@DougStevenson。我刚刚尝试通过该链接提交晚餐请求,但表单无法提交请求!讽刺的是,不是吗?此外,虽然 nodejs 可能会发送错误,但我认为 Firestore SDK 是根本原因,因为一旦我调用 query.get() 就会发生错误。
  • 如果您在使用支持表单时遇到问题,请跳到 firebase.community 并直接 ping 我 (katowulf)。我会帮忙的。
  • @Kato,我通过不附加任何文件而是在表单本身中发布所有信息(和代码)来实现它。

标签: firebase google-cloud-firestore google-cloud-functions


【解决方案1】:

看起来这个错误MaxListenersExceededWarning: Possible EventEmitter memory leak detected #694 可能是这里的问题。

解决方法是使用npm install @grpc/grpc-js@0.5.2 --save-exact,直到错误得到修复并且Firestore 库开始使用它。

【讨论】:

  • 谢谢!这确实解决了这个问题。我还收到了谷歌关于此的公开支持请求。我会让他们知道这个解决方法。
  • 我赞成!这似乎也为我解决了这个问题。谢谢!
【解决方案2】:

我收到了 Firebase 支持团队的有用回复。他们告诉我尝试安装最新版本的 firebase-admin(将其从 8.5.0 升级到 8.6.0)并解决了问题,即使没有安装 grpc 的解决方法。所以,我认为现在这应该是正确的答案了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2010-10-12
    相关资源
    最近更新 更多