如何确保使用 Firebase 只处理一次作业

How to ensure that a job is processed only once with Firebase

我正在将任务作为文档添加到 Firestore 集合中。在后端,我有多个处理这些任务的 NodeJs 无状态实例。所有实例都在监听集合中的实时变化

firestore().collection('Tasks').onSnapshot(startTask, onError);

在这种情况下,所有 NodeJs 实例都会在添加任务时收到通知。如何确保只有其中一个处理任务?我虽然考虑使用 firebase-queue 但似乎该项目已过时。有没有办法在没有额外模块的情况下做到这一点? 运行 NodeJs 作为 Firebase 功能不适合我。

一种可能的解决方案是通过 Transaction.

向 Firestore 文档添加“已处理”标志

给定的 Node.js 实例仅应在未标记为已处理的情况下处理该任务(例如,您在事务开始时检查字段 treated 是否设置为 true 如果是这种情况,您会抛出错误,请参阅示例)。在成功处理它之后,Node.js 实例应将文档标记为已处理(当然在同一事务中)。

由于您使用 Node.js 服务器(即您使用 Node.js 服务器客户端库),事务将锁定它正在读取的任务文档 因此其他实例无法修改文档。这样你就可以确定它只会被处理一次。

文档中有关服务器客户端库 here 中数据争用的更多详细信息。