一、前言
上一篇文章还是2个星期前写的,近段时间有点懒,本来这篇也不太愿意动笔写,但这两天关注数据,发现新的一年已经收获了4个粉丝,首先感谢大家的关注,我以后还是会尽量多写一点。这篇文章讲一下今天我们微服务重构项目中测试时碰到的问题,我们有一个功能做商品上下架,当点击了开关按纽,设置商品上架,但前端页面还是显示下架状态,这里调用了两个接口,一个接口更新状态(商品库DB、商品ES),然后立即调用查询接口(走ES),发现返回来的数据还是下架状态,但这时候再去Kinaba控制台查发现状态已经是上架的。
二、问题原因
ES在进行写操作时,会先在内存中缓存一段数据,然后采取一定的策略,将 这些数据写入磁盘,这个过程称Refresh,每次Refresh都会产生一个新的Lucene段,但段过多又会消耗文件句柄,内存,所以又有一定的策略将这些较小的段合并为大的段,刷新的ES默认采用每隔1秒定时刷新,所以刚写进去的数据立即去查极有可能是查不到。
三、解决方案
1、直接修改ES刷新频率
注:不建议生产环境采用该方案,并且这个刷新时间你也很难确定。
2、请求接口请求后强制刷新
注:ES8的语法,包括新写入数据、变更数据、删除数据都存在不会立即刷新的问题。