如何在 Elasticseach 的并发环境中锁定/同步已使用的文档



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

这个问题可以通过 Elasticsearch 解决吗,或者我需要在我这边实现锁定/同步吗?例如,如果 2 个工人要求提供最新的 20 个文档,我需要某种方法为每个工人返回不同的 20 个文档。

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

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

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

最新更新