具有批处理功能和云功能的多个Firestore更改

时间:2018-11-14 09:35:56

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

在聊天应用程序中,如果我向消息集合中添加新消息,则还需要更新另一个集合中的特定聊天文档,以显示最后一条消息以及发送该消息的时间。现在,每次有新消息出现时,我都会触发云功能,以更新聊天的元数据。我是在做正确的事,还是使用批处理写更合适?

1 个答案:

答案 0 :(得分:2)

在使用一种方法与另一种方法时,您可能会意识到有所不同。使用批处理写入时,请根据官方文档:

  

您可以作为一个批处理执行多个写操作,其中包含set(),update()或delete()操作的任意组合。一批写操作是原子完成的,可以写到多个文档。

这意味着那些以 atomic 方式同时进行的更新,要么所有更新成功,要么所有更新失败。

如果您使用的是一旦发送消息即被触发的功能,则意味着您正在执行两个单独的操作。第一个是发送消息,第二个是成功发送消息后更新一些元数据。在这种情况下,根据官方文档,您可以发送消息,但功能可能会失败:

  

默认情况下,不启用重试功能,执行后台功能的语义是“尽力而为”。这意味着尽管目标是只执行一次功能,但不能保证。

这是why background functions fail to complete的原因:

  

在极少数情况下,某个函数可能由于内部错误而过早退出,并且默认情况下该函数可能会自动重试,也可能不会自动重试。

     

更典型地,由于功能代码本身引发错误,后台功能可能无法成功完成。可能发生这种情况的一些原因如下:

     
      
  • 该函数包含一个错误,运行时引发异常。
  •   
  • 该功能无法到达服务端点,或在尝试到达该端点时超时。
  •   
  • 该函数有意引发异常(例如,当参数验证失败时)。
  •   
  • 使用Node.js编写的函数返回被拒绝的承诺或将非null值传递给回调时。
  •   

在这种情况下,解决方法是use retry to handle transient errors