elasticsearch - 如何在 Elasticseach 的并发环境中锁定/同步已使用的文档
问题描述
我在索引中存储不同的文档。一些工作人员正在此索引中搜索所需的文档并将它们用于自己的逻辑。问题是我想将找到的文档标记为工作人员使用的文件(或完全删除它们),但问题是多个工作人员可能会获得相同的文件,因为工作人员同时要求提供文件。
这个问题可以通过 Elasticsearch 解决,还是我需要在我这边实现锁定/同步?例如,如果 2 名工人要求最新的 20 份文件,我需要某种方式为每个工人返回不同的 20 份文件。
解决方案
Elasticsearch 提供带有乐观锁定支持的更新操作。因此,您可以进行搜索并获取文档列表,然后为每个文档尝试锁定它。需要传递给更新 API 的确切参数将根据 Elasticsearch 版本而有所不同,您可以使用附加属性,例如locked: true
,这将允许工作人员在进行初始搜索时忽略锁定的文档。更新可能成功或失败取决于它是否同时被其他工作人员锁定。如果失败,请忽略那些文件。
这种方法的效果取决于工作人员的数量以及当他们尝试锁定同一个文档时会出现的争用。归根结底,Elasticsearch 不是一个排队系统,可能不会针对这些用例进行优化。
您可能还对Percolate Query感兴趣,它可以反转条件。您的工作人员可以注册一组查询,而不是搜索与特定查询匹配的文档,然后在索引文档时,只需发出渗透查询并查看文档是否与任何已注册的查询匹配,如果匹配,则将文档推送到工作队列。使用这种方法,Elasticsearch 仅用于搜索。工作人员之间的作业分配将由工作人员队列处理。
推荐阅读
- javascript - 将一段数据从子组件传递到父组件是否是反应中的反模式?
- python - 在 Windows 上使用 Python 中的独占锁定打开文件
- compilation - 大型隐含 do 循环的 gfortran 编译时间长
- spring - 让我的春季项目运行还有哪些其他可能的问题?
- aws-lambda - AWS api网关和java lambda函数的CORS错误
- python - 如何使 Django 基于调试标志使用两个不同的数据库
- python - Tensorflow ImportError:找不到指定的模块
- jenkins - 使用 Job DSL 禁用多分支管道作业的并发构建
- azure-web-app-service - Docker 容器部署在 Azure Web 应用程序中失败
- python - Python、Selenium、Web 选项卡帮助