首页 > 解决方案 > 如何在 Elasticseach 的并发环境中锁定/同步已使用的文档

问题描述

我在索引中存储不同的文档。一些工作人员正在此索引中搜索所需的文档并将它们用于自己的逻辑。问题是我想将找到的文档标记为工作人员使用的文件(或完全删除它们),但问题是多个工作人员可能会获得相同的文件,因为工作人员同时要求提供文件。

这个问题可以通过 Elasticsearch 解决,还是我需要在我这边实现锁定/同步?例如,如果 2 名工人要求最新的 20 份文件,我需要某种方式为每个工人返回不同的 20 份文件。

标签: elasticsearch

解决方案


Elasticsearch 提供带有乐观锁定支持的更新操作。因此,您可以进行搜索并获取文档列表,然后为每个文档尝试锁定它。需要传递给更新 API 的确切参数将根据 Elasticsearch 版本而有所不同,您可以使用附加属性,例如locked: true,这将允许工作人员在进行初始搜索时忽略锁定的文档。更新可能成功或失败取决于它是否同时被其他工作人员锁定。如果失败,请忽略那些文件。

这种方法的效果取决于工作人员的数量以及当他们尝试锁定同一个文档时会出现的争用。归根结底,Elasticsearch 不是一个排队系统,可能不会针对这些用例进行优化。

您可能还对Percolate Query感兴趣,它可以反转条件。您的工作人员可以注册一组查询,而不是搜索与特定查询匹配的文档,然后在索引文档时,只需发出渗透查询并查看文档是否与任何已注册的查询匹配,如果匹配,则将文档推送到工作队列。使用这种方法,Elasticsearch 仅用于搜索。工作人员之间的作业分配将由工作人员队列处理。


推荐阅读