【问题标题】:Firebase function document.create and user.create triggers firing multiple timesFirebase 函数 document.create 和 user.create 触发器多次触发
【发布时间】:2020-01-09 17:01:18
【问题描述】:

我正在尝试跟踪集合中的文档数量以及我的 Firebase 项目中的用户数量。我设置了一些 .create 触发器来使用增量更新统计文档,但有时 .create 函数会为单个创建事件触发多次。 Firestore 文档和新用户都会发生这种情况。有什么想法吗?

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const firestore = require('@google-cloud/firestore')
admin.initializeApp();

const db = admin.firestore()

/* for counting documents created */
exports.countDoc = functions.firestore
  .document('collection/{docId}')
  .onCreate((change, context) => {
    const docId = context.params.docId
    db.doc('stats/doc').update({
      'docsCreated': firestore.FieldValue.increment(1)
    })
    return true;
  });

/* for counting users created */
exports.countUsers = functions.auth.user().onCreate((user) => {
  db.doc('stats/doc').update({
    'usersCreated': firestore.FieldValue.increment(1)
  })
  return true;
});

谢谢!

【问题讨论】:

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


    【解决方案1】:

    有一些关于如何实现函数的幂等性的建议。

    FieldValue.arrayUnion()FieldValue.arrayRemove() 函数可以安全地删除和添加元素到数组中,如果要删除的元素不存在,则不会出现重复或错误。

    您可以在文档中创建名为“用户”和“文档”的数组字段,并通过触发函数在其中添加带有FieldValue.arrayUnion() 的数据。使用这种方法,您可以通过获取 usersdocs 字段并在其上调用 .size() 来检索客户端的实际大小。

    【讨论】:

      【解决方案2】:

      您应该期望每个事件可能会多次执行后台触发器。这应该是非常罕见的,但并非不可能。这是 Cloud Functions 为您提供“至少一次执行”的保证的一部分。由于内部基础架构对于在专用服务器实例上执行代码是完全异步的,因此该基础架构可能不会收到您的函数成功完成的信号。在这种情况下,它会再次触发该功能以确保交付。

      如果这对您的应用很重要,建议您将函数编写为幂等的,以便处理这种情况。正确实现这并不总是一件非常简单的事情,并且还会给您的代码增加很多重量。对于不同类型的场景,也有很多方法可以做到这一点。但选择权在你。

      documentation for execution guarantees 中了解更多信息。

      【讨论】:

        猜你喜欢
        • 2018-05-16
        • 1970-01-01
        • 2016-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多