Elasticsearch的upsert操作是否存在并发覆盖问题?
Elasticsearch 近实时延迟下重复upsert是否会覆盖文档
首先给出明确结论:不会出现你担心的意外覆盖问题。
核心原因是ES的近实时查询限制,和写操作的文档存在性校验走的是完全不同的逻辑:
- 你提到的写入后短时间查不到文档的近实时延迟,仅针对普通的
search查询请求:文档写入后会先进入内存缓冲区,同时落盘translog日志,默认每1秒执行一次refresh操作生成可检索的段文件之后,才会被普通查询搜到。 - 而ES原生的
upsert操作,判断文档是否存在的逻辑不走普通search的查询路径,会直接从translog、内存缓冲区里按文档ID定位记录,不需要等refresh完成。就算刚写入的文档还没对普通查询可见,upsert也能准确识别到这篇文档的存在,不会误判为文档不存在而执行插入覆盖。
要注意只有一种情况会出问题:如果你没有直接用ES原生的upsert接口,而是自己在业务代码里先发起普通search查询判断文档是否存在,再手动选择执行插入还是更新,这种实现逻辑才会受近实时延迟影响,出现重复插入覆盖的问题。
内容的提问来源于stack exchange,提问作者Gao
相关产品推荐
相关产品推荐

