1
在并发情况下,同时操作ES时会造成数据不准确的问题。因为es默认采用乐观锁机制,也就是他有一个
_version的概念,假设有两个线程同时修改操作es, 第一个线程拿到值为1,
_version为1, 第二个线程拿到值为1,
_version为1, 这时第二个线程比较快,将这个值修改为3, 并
_version为2(
_version是es自动更改的,任何操作都会更新这个值, 包括删除操作
) , 这时线程1在去更新es就会失败,因为他们的
_version版本不一致, 这条数据就会被舍弃掉,其实es有一个默认重试机制(
retry_on_conflict
),就是如果
_version值不同的话,会默认获取新的
_version值进行重试,默认是0, 最大只可以设置为5, 也就是说, 如果你设置重试机制为5, 当5次重试后
_version依旧不一致, 那么该线程的数据就会被es丢弃, 造成数据损失
这个问题暂时没有解决掉, 临时采用线程池解决, 设置线程池核心线程为1, 这时可以保证只有一个线程在操作该条es数据......
该实验是基于1000并发同时操作实验的, 如果你的同时并发没有很高,使用_version 重试机制还是可以满足大部分场景,只有一瞬间并发很高的时候,重试5次依旧没有更新到合适的_version版本时, 临时使用单个核心线程解决, 后边有机会在研究
2 注意,如果有查询条件不生效的情况, 就去看看你索引字段类型是否支持查询,一般字符串使用keyword类型,增加命中率
3 在查询订单信息后,需要通过每个订单信息去查询该订单的商品信息,遇到的问题,如果你的查询条件参数太长(比如同时有10个订单编号去查询,会发生未命中的情况), 也是会请求失败的,es解析不到太长的参数集(使用Get查询)