【发布时间】:2019-04-17 05:30:42
【问题描述】:
在聊天应用程序中,如果我向消息集合添加新消息,我还需要在另一个集合中更新该特定聊天的文档以显示最后一条消息及其发送时间。现在,每当有新消息出现时,我都会触发云功能,以更新聊天的元数据。我是在做正确的事,还是改用批量写入更合适?
【问题讨论】:
标签: firebase google-cloud-firestore google-cloud-functions
在聊天应用程序中,如果我向消息集合添加新消息,我还需要在另一个集合中更新该特定聊天的文档以显示最后一条消息及其发送时间。现在,每当有新消息出现时,我都会触发云功能,以更新聊天的元数据。我是在做正确的事,还是改用批量写入更合适?
【问题讨论】:
标签: firebase google-cloud-firestore google-cloud-functions
在使用一种方法与另一种方法时,您可能会注意到不同之处。使用批量写入时,根据官方文档:
您可以将多个写入操作作为一个批处理执行,其中包含 set()、update() 或 delete() 操作的任意组合。一批写入原子完成,可以写入多个文档。
这意味着以这种原子方式进行的同时更新,要么全部更新成功,要么全部更新失败。
如果您使用的是在发送消息后触发的功能,这意味着您正在执行两个单独的操作。第一个是发送消息,第二个是在消息发送成功后更新一些元数据。在这种情况下,您可以发送消息,但您的功能可能会失败,根据官方文档:
默认情况下,如果不启用重试,执行后台函数的语义是“尽力而为”。这意味着虽然目标是只执行一次函数,但不能保证。
这就是原因why background functions fail to complete:
在极少数情况下,函数可能会由于内部错误而过早退出,默认情况下该函数可能会自动重试,也可能不会。
更典型的情况是,后台函数可能由于函数代码本身引发的错误而无法成功完成。可能发生这种情况的一些原因如下:
- 函数包含错误,运行时抛出异常。
- 函数无法到达服务端点,或尝试到达端点时超时。
- 函数有意抛出异常(例如,当参数验证失败时)。
- 当用 Node.js 编写的函数返回被拒绝的 Promise 或将非空值传递给回调时。
在这种情况下,解决方法是发送至use retry to handle transient errors。
【讨论】: