Bre*_*ing 3 firebase google-cloud-functions google-cloud-firestore
我有一个由Firestore数据库写入触发的云功能.它执行异步操作(从某些第三方API获取数据)可能需要很长时间,可能不会.完成后,它会将结果写入"搜索结果"字段.
存在可能的竞争条件,其中较新的触发器的结果被较旧的操作覆盖,该操作稍后完成.如何在Firebase云功能和Firestore环境中解决此问题?
Fra*_*len 12
一般来说,这里有两种方法:
这通常是最具规模和架构简单的.当您对同一输入执行相同的幂等操作时,它具有相同的结果.这意味着操作多次执行无关紧要,因为结果是相同的.
一个很好的例子是关于数组和集的Firestore文档.想象一下,您正在使用类别标记博客文章.一个天真的模型是:
{
title: "My great post",
categories: [
"technology",
"opinion",
"cats"
]
}
Run Code Online (Sandbox Code Playgroud)
但现在想象两个用户几乎在同一时间标记同一个帖子.你最终可能会
{
title: "My great post",
categories: [
"technology",
"opinion",
"cats",
"cats"
]
}
Run Code Online (Sandbox Code Playgroud)
这显然不是你想要的.但由于数据结构允许,可能会发生这种情况.这里理想的解决方案是使用一种不可能的数据结构:一种数据结构,其中添加cat是幂等操作.在数学术语中,这将是一个集合,在Firestore中,您将其模型化为:
{
title: "My great post",
categories: {
"technology": true,
"opinion": true,
"cats": true
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在这种结构中,不要紧,你多久设置cats到true,结果将始终是相同的.
有时,不可能(或不可行)使您的操作具有幂等性.在这种情况下,您还可以考虑使用比较和设置策略.
例如,假设第三方API以某种方式更改数据,并且如果数据库中的原始数据未经修改,您只想将结果写回数据库.在这种情况下,您需要在函数中执行以下步骤:
这种类型的比较和设置操作实际上是Firebase的实时数据库实现事务的方式,"第三方API"是您的应用程序事务处理程序.
您可能会看到第二种方法比使用幂等操作的方法更复杂.所以在可能的情况下,我总是建议这种方法.
| 归档时间: |
|
| 查看次数: |
1071 次 |
| 最近记录: |