es mysql延迟_ES 近实时搜索 更新延迟问题
一、问题发现
有段代码更新 ES中的数据状态,将未读置成已读。是查一批,更新一批,再查再更新。
public Boolean updateDealStatus(WarningQuery warningQuery) {
....省略不重要的代码
while (true) {
// 调用服务
// ES查询不分页一次就出来10条
List list = warningEsDao.findByQuery(WarningZsdRiskEsEntity.class, warningZsdRiskQuery, esSort);
// 为空或者null就不继续跑了
if (list == null || list.isEmpty()) {
break;
}
log.info("查询出来的数量" + list.getSize());
// 将一批数据都置成已读
for (WarningZsdRiskEsEntity esEntity : list) {
esEntity.setDealStatus(1);
esEntity.setModified(System.currentTimeMillis());
warningEsDao.save(esEntity);
}
}
return true;
}
在测试的时候发现有问题。
我提前看了ES里这个范围的数据就27条,结果打印查询数量的日志log.info("查询出来的数量" + list.getSize());的结果类似这样。
查询出来的数量 10
查询出来的数量 10
查询出来的数量 10
查询出来的数量 10
查询出来的数量 10
查询出来的数量 10
查询出来的数量 10
查询出来的数量 10
查询出来的数量 10
查询出来的数量 8
查询出来的数量 7
查询出来的数量 2
查询出来的数量 0
这个肯定是有问题的,27就行了,结果查了这么多次。这个问题的原因就是 – –ES 更新数据是有延迟的,也就是搜索只能支持“近实时”。
二、ES 近实时搜索介绍
在 Elasticsearch 中,写入和打开一个新段的轻量的过程叫做 refresh 。 默认情况下每个分片会每秒自动刷新一次。这就是为什么我们说 Elasticsearch 是 近 实时搜索:
文档的变化并不是立即对搜索可见,但会在一秒之内变为可见。
这些行为可能会对新用户造成困惑: 他们索引了一个文档然后尝试搜索它,但却没有搜到。这个问题的解决办法是用 refresh API 执行一次手动刷新
POST /_refresh // 刷新(Refresh)所有的索引。
POST /blogs/_refresh // 只刷新(Refresh) blogs 索引
尽管刷新是比提交轻量很多的操作,它还是会有性能开销。当写测试的时候, 手动刷新很有用,但是不要在生产环境下每次索引一个文档都去手动刷新。 相反,你的应用需要意识到 Elasticsearch 的近实时的性质,并接受它的不足。
三、解决问题
好知道了ES 的这个特性,造成了我们的bug 那就 扬长避短。
两种解决方法:
1、更新后等1s在去查。
2、用Scroll 去查,一次查询有个快照。我们只会搂一次快照版本的数据,然后进行写操作置状态。就不用管了。不会把一次已经置了状态的再搂出来的。
第二种方法的代码 。
public Boolean updateDealStatus(WarningQuery warningQuery) {
....省略不重要的代码
// 滑轮初始设置为null
String scrollId = null;
while (true) {
// 调用服务
// ES查询
EsScrollResponse response = warningEsDao.listByQueryScroll(WarningZsdRiskEsEntity.class, warningZsdRiskQuery, scrollId, 200);
// 为空或者null就不继续跑了
if (response == null || response.getData() == null || response.getData().isEmpty()) {
break;
}
// 将一批数据都置成已读
for (WarningZsdRiskEsEntity esEntity : response.getData()) {
esEntity.setDealStatus(1);
esEntity.setModified(System.currentTimeMillis());
warningEsDao.save(esEntity);
}
scrollId = response.getScrollId();
}
return true;
}
es mysql延迟_ES 近实时搜索 更新延迟问题相关推荐
- ElasticSearch探索之路(五)集群与分片:选举、动态更新、近实时搜索、事务日志、段合并
文章目录 集群内部原理 集群与节点 分片 选举 分片内部原理 索引不变性 动态更新索引 近实时搜索 事务日志 段合并 集群内部原理 集群与节点 一个运行中的Elasticsearch实例称为一个节点, ...
- 如何基于Canal 和 Kafka,实现 MySQL 的 Binlog 近实时同步
转载自 如何基于Canal 和 Kafka,实现 MySQL 的 Binlog 近实时同步 近段时间,业务系统架构基本完备,数据层面的建设比较薄弱,因为笔者目前工作重心在于搭建一个小型的数据平台.优先 ...
- lucene4.5近实时搜索
近实时搜索就是他能打开一个IndexWriter快速搜索索引变更的内容,而不必关闭writer,或者向writer提交,这个功能是在2.9版本以后引入的,在以前没有这个功能时,必须调用writer的c ...
- 剖析Elasticsearch集群系列第三篇 近实时搜索、深层分页问题和搜索相关性权衡之道...
http://www.infoq.com/cn/articles/anatomy-of-an-elasticsearch-cluster-part03?utm_source=infoq&utm ...
- ElasticSearch近实时搜索的实现
ElasticSearch近实时搜索的实现 1.近实时搜索 1.1 实时与近实时 实时搜索(Real-time Search)很好理解,对于一个数据库系统,执行插入以后立刻就能搜索到刚刚插入到数据.而 ...
- solr 近实时搜索
摘要: Solr的近实时搜索NRT(Near Real Time Searching)意味着文档可以在索引以后马上可以被查询到.Solr不会因为本次提交而阻塞更新操作,不会等待后台合并操作(merge ...
- centos7时间同步_基于 Canal 和 Kafka 实现 MySQL 的 Binlog 近实时同步
点击蓝色"架构文摘"关注我哟 加个"星标",每天上午 09:25,干货推送! 作者:Throwable 掘金:https://juejin.im/post ...
- 基于 Canal 和 Kafka 实现 MySQL 的 Binlog 近实时同步
前提 近段时间,业务系统架构基本完备,数据层面的建设比较薄弱,因为笔者目前工作重心在于搭建一个小型的数据平台.优先级比较高的一个任务就是需要近实时同步业务系统的数据(包括保存.更新或者软删除)到一个另 ...
- MYSQL数据库跨服务器实时同步更新实践----文献阅读(污水管网水质预测)
文章目录 摘要 一. MYSQL 数据库主从复制,实时同步的再现 1. 1 先下载虚拟机(硬件)与lunxi系统(centos7) 1.2 在lunxi 系统安装rpm 版mysql 5.5.55 1 ...
最新文章
- React模式:集中式PropTypes
- gpu处理信号_在PyTorch中使用DistributedDataParallel进行多GPU分布式模型训练
- mysql的正则书写规则_MySql中正则表达式的使用方法描述
- 兄弟,就你这智商就别出轨了吧?
- 计算机应用基础知识点提纲,计算机应用基础复习提纲
- 补码(为什么按位取反再加一):告诉你一个其实很简单的问题(转自醍醐灌顶)...
- 求朋友圈的个数 Friend Circles
- 想把PDF论文里面的图片导出来,有什么办法
- 三角形箭头向右的_向右三角形特殊符号
- [从零开始学习FPGA编程-26]:进阶篇 - 基本组合电路-数据选择器(Verilog语言)
- 手机、电话号码、邮箱、域名、身份证号的测试用例
- 【网络安全】GitHub项目监控,teemo子域名查询
- Win11微软输入法打不出汉字怎么办?
- 桌面视频录制软件有哪些?怎么简单又快地录制视频?
- 校园招聘-2017美团后台开发内推笔试编程题
- 【Allegro_SPB_16.6安装详细教程】手把手搭建到Win10
- 【300+精选大厂面试题持续分享】大数据运维尖刀面试题专栏(十四)
- imoo c1语言设置在哪里,imoo C1学生手机怎么样?imoo C1参数配置介绍
- 2008年8月5号,晴,今天天气开始变热了。业精于勤,荒于嬉。—— 韩 愈《进学解》
- Floyd算法求无向图最小环