已解决 - Elasticsearch 操作更新数据后,没有立即生效问题
  kwaEBKFM30Cs 2023年11月01日 50 0
  1. 问题描述:
    SpringBoot 项目使用 RestHighLevelClien 操作ES修改数据成功,之后前端调用查询接口发现数据并未更新,待1S左右再次刷新发现ES数据成功更新。
    从现象来看是ES操作后存在延迟。
  2. 问题原因
    这个问题是Elasticsearch本身在操作数据后有一定的延迟性导致。Elasticsearch默认情况下在写入数据后,是要等1s后才能被查询到。
    因为Elasticsearch中每次索引refresh会产生一个新的 lucene 段,这会导致频繁的 segment merge 行为,对系统 CPU 和 IO 占用都比较高。
  3. 解决方案  
    • 方案1:代码中指定setRefreshPolicy的刷新策略,使用立即刷新策略IMMEDIATE方式提交请求。
      1     public static enum RefreshPolicy implements Writeable {
      2 NONE("false"), 3 IMMEDIATE("true"), 4 WAIT_UNTIL("wait_for"); 5 }
      • IMMEDIATE:
        请求想ES提交了数据,立即刷新数据再结束请求
        优点:实时性最高,实时性最高
        缺点:消耗资源高
      • WAIT_UNTIL
        请求向ES提交数据,等待1S(默认)后结束请求,数据刷新。
        优点:实时性相对较高
        缺点:资源消耗低
      • NONE(默认策略)
        请求向ES提交数据,不等待数据完成刷新,直接结束请求。
        优点:操作延时短,资源消耗低
        缺点:实时性低
      • 支持的接口:
        删除:DeleteRequestBuilder
        新增:IndexRequestBuilder
        更新:UpdateRequestBuilder
        批量:BulkRequestBuilder
    • 方案2:前端后后端,使用sleep的方式延迟调用API,等待ES数据更新后再进行请求
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   55   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   114   0   0 Java
  8s1LUHPryisj   2024年05月17日   49   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
kwaEBKFM30Cs