在MongoDB中阻止多个服务访问同一文档,直到处理完毕

时间:2017-12-05 09:29:09

标签: python mongodb nosql mongodb-query microservices

我有多个服务实例。此服务访问未处理文档的集合。我们正在使用MongoDB。服务的作用是:

  1. 从集合A中获取第一个未处理的文档。
  2. 使用uuid进行休息通话。
  3. 获取响应并将响应存储在另一个集合B中。
  4. 多个服务可能会访问导致重复的同一文档。我能想到的处理这种情况的步骤:

    1. FindandModify()以及进度字段。因此,我们将调用此函数并将进度字段的查询设置为" 0"。我们将值更新为1,以便其他服务无法访问它。在从Rest调用中获得成功后,我们可以删除该记录。在获得失败后,我们将再次使用更新值调用FindandModify()为" 0"所以其他服务可以在以后访问。

    2. 我们调用Find()函数,它将为我们提供一个文档。我们得到了" _id"文档并将其存储到另一个集合中。如果另一个服务也获得相同的文档和该文档" _id"已经存在了。然后它不会再次插入,该服务再次调用Find()函数。

    3. 这些方法的性能和瓶颈是什么?我们还有其他更好的方法可以提高性能。

1 个答案:

答案 0 :(得分:0)

  

FindandModify()以及进度字段。因此我们将调用此函数并将进度字段的查询设置为“0”。我们将值更新为1,以便其他服务无法访问它。在从Rest调用中获得成功后,我们可以删除该记录。在获得失败时,我们将再次使用更新值调用FindandModify()为“0”,以便其他服务可以在以后访问。

这个解决方案没问题,比第二个更简单,更快。

  

我们调用Find()函数,它将为我们提供一个文档。我们得到文档的“_id”并将其存储到另一个集合中。如果另一个服务也获得相同的文档,并且该文档“_id”已经存在。然后它将不会再次插入,该服务再次调用Find()函数。

此解决方案(如您所示)将无效,除非在第二个集合中插入文档后将其从第一个集合中删除,否则将在无限循环中捕获进程。缺点是这个解决方案意味着两个集合和文档移动过程。

在任何情况下,您都必须考虑到任何阶段的流程失败,您必须能够检测到故障并从中恢复。