我一开始并没有发现这个问题,到后面 Debug 的时候猜想并与社区的小伙伴得到验证。

我们的问题是 elasticsearch 返回成功但是却并没有发生更新。

我们的策略是,每发生一次变化就更新一次 elasticsearch ,但更新频达到了批量对一系列文档达到了 5、6 次的更新,我们忽略了虽然每次更新成功,但 update 字段为 0 ,只有前面几个更新成功了。于是我们合并了多余的请求,减少更新次数,成功使得每次更新成功。

根据文档:

变更越频繁,读数据和更新数据的间隙越长,也就越可能丢失变更。

Elasticsearch 中使用的这种方法假定冲突是不可能发生的,并且不会阻塞正在尝试的操作。 然而,如果源数据在读写当中被修改,更新将会失败。应用程序接下来将决定该如何解决冲突。 例如,可以重试更新、使用新的数据、或者将相关情况报告给用户。

频繁的更新会导致后续更新的丢失,使得更新虽然返回成功,但实际上还是失败的,通过 update 字段可以判断更新数。