考虑到ElasticSearch优秀的索引和检索性能,项目中使用ES作为前台搜索引擎,但是在创建和更新ES数据的时候,由于种种原因,可能会出现ES更新失败,造成ES数据和数据库最新真实数据出现不一致的现象。在做项目的过程中整理了一下四种解决方案:
- 1、开一张表专门记录创建和更新ES数据失败的信息(比如我们项目中主需要记录主表ID,更新数据时根据ID组装数据),然后设置一个定时任务,定时向ES更新失败的数据;
- 2、小批量、多批次更新;通俗讲就是设置固定时间间隔,然后更新先前一段时间的数据,比如每隔10分钟,全量更新前20分钟的数据;缺点就是有些数据正常的数据也更新了,消耗性能;
- 3、大批量,小批次更新;和第二条阐释类似,比如在每天夜晚2点种,全量更新某一时间段范围(1或2天)、某一标签或类别(商品、服务)、某一地区、某类用户画像等等可以分类分区的数据;
- 4、定时任务,异步全量查询数据库表,开多线程,更新ES;消耗大量资源,且全量更新数据库表也不科学;
我司另一个项目组采用方案2,但是从消耗资源和技术设计角度讲,我认为上述四条方案中,方案1最佳,方案4最差。
有考虑不周或不对的地方,还请各路大神敬请留言,不吝赐教