Spring 相同微服务的多个实例不应获取和更新相同的MongoDB文档
问题陈述: 我们的微服务中有一个调度器,它将获取10个请求文档,然后开始处理它们,然后更新每个文档的状态 我们计划部署同一微服务的三个实例。一旦所有三个实例开始执行调度器,那么每个实例将获取10个请求文档并开始处理它们Spring 相同微服务的多个实例不应获取和更新相同的MongoDB文档,spring,mongodb,transactions,microservices,Spring,Mongodb,Transactions,Microservices,问题陈述: 我们的微服务中有一个调度器,它将获取10个请求文档,然后开始处理它们,然后更新每个文档的状态 我们计划部署同一微服务的三个实例。一旦所有三个实例开始执行调度器,那么每个实例将获取10个请求文档并开始处理它们 不应在多个实例中获取和处理相同的请求文档。如何确保microservice的每个实例选择10个不同的文档?您的每个工作人员都应该选择一组不同的文档 例如,如果您的文档具有自动递增的数字标识: 工作者1可以获取ID%3=0的所有文档 工作者2可以获取ID%3=1的所有文档 工作者3
不应在多个实例中获取和处理相同的请求文档。如何确保microservice的每个实例选择10个不同的文档?您的每个工作人员都应该选择一组不同的文档 例如,如果您的文档具有自动递增的数字标识: 工作者1可以获取ID%3=0的所有文档 工作者2可以获取ID%3=1的所有文档 工作者3可以获取ID%3=2的所有文档
如果autoincrement ID不可用,您可以查看一致散列,这非常好学 哈希很简单: 计算文档ID的哈希值 使用此哈希可获取应处理此文档的工作人员 这种方法的问题是,假设您的文档ID散列的范围在1到1000之间,并且您使用的是上述相同的方法。您可能最终会遇到工人1比工人2得到更多的工作
使用一致散列,可以扩展范围以获得更平衡的结果。自动增量ID不可用。你能为一致的散列提供一些好的参考吗?我已经编辑了回复。我建议您从简单的散列开始。只需散列文档ID,然后使用我给您的模示例。如果您想执行额外的步骤,可以使用一致散列。它在互联网上随处可见。感谢您提出的解决方案,这很好,但在我的场景中,我们没有数字ID。我期待一些与MongoDB事务相关的解决方案。获取条件将是唯一的请求状态。