MQ异步同步搜索引擎ElasticSearch数据踩坑
业务背景
在大型网站中,为了减少DB压力、让数据更精准、速度更快,将读拆分出来采用搜索引擎来为DB分担读的压力,ElasticSearch就是目前市面上比较流行的搜索引擎,他的检索速度奇快、支持各种复杂的全文检索,在各种场景下对比其他的搜索引擎的检索速度都显得尤为出众。这篇就先不介绍ElasticSearch了,后续我会出一个ElasticSearch的教程,目前已经写的查不多了,mq相信大家应该最熟悉就不过多介绍了。
使用搜索引擎,我们需要将DB中的数据同步到搜索引擎中,为了保证让用户看见最优质的数据所以讲搜索引擎中的数据进行优化,简称:搜索池。将一些不达标的数据不展示出给用户。将不同种类的数据类型,添加进入搜索池的条件,如果添加修改搜索池为同步操作,操作频繁并且如果处理时间过长可能会引发超时等等一些问题,影响了核心业务的操作。所以讲同步搜索池数据的操作采用mq异步执行同步数据任务,这样数据的同步就不会影响核心业务的操作。但是虽然解决了保证核心业务的处理但是有时也会有许多坑,这里作者就分享一次踩坑经历。
问题背景
在批量同步数据的时候,每次执行了一遍删除数据的个数与添加一遍后的个数对不上,例如:一共有20条数据,删除一批数据剩10条,同样的添加了这批数据还剩18条,这2条数据就丢了。这时候就比较苦恼了,检查了业务与另一个线程的业务也没有发现报错或者逻辑出现问题。伪代码:
public Integer 方法名(参数){
//批量修改操作 DAO
参数集合.forEash(s->{
//遍历将变更数据唯一id发送mq
});
}
问题分析
这里是修改完数据后发送mq请求,根据传参的不同添加或者删除 搜索引擎中的数据。按逻辑来说这样子写是没有什么问题的。但是经过层层的调试,终于发现了问题所在。在我们的系统中这个类是被加上事物的,因为是update数据所以这些操作都是会加上事物的。那事物为什么会影响呢?看下图

很明显的看到在没有真正修改数据之前先发送了mq请求,而mq拿到请求去查询这些数据的时候这些数据的状态还没有被真正修改。所以先发送mq请求和真正修改数据之间的短时间变差,导致了优先被发送mq请求的前几条数据出现问题。所以在批量发送mq请求的时候一定要注意事物控制的问题,单量操作一般不会出现问题,因为单量的速度是很快的。提醒大家在提高性能的同时,一定要仔细评估方案细节。
MQ异步同步搜索引擎ElasticSearch数据踩坑的更多相关文章
- 全文搜索引擎 Elasticsearch 安装踩坑记录
一.安装 Elastic 需要 Java 8 环境.如果你的机器还没安装 Java 安装完 Java,就可以跟着官方文档安装 Elastic.直接下载压缩包比较简单. $ wget https://a ...
- vue+axios访问本地json数据踩坑点
当我们想在vue项目中模拟后台接口访问json数据时,我们发现无论如何也访问不到本地的json数据. 注意:1.在vue-cli项目中,我们静态资源只能放在static文件夹中,axios使用get请 ...
- elasticsearch安装踩坑记
ES的安装与启动时问题解决 环境: 系统环境:CentOS7 JDK:jdk-8u131-linux-x64.tar.gz 不可以通过Root用户来启动ES 通过上面的错误提示可以看出,can ...
- Struts2返回json格式数据踩坑记录
事件起因 昨天提测修改冻结/解冻银行卡样式的功能,微姐测试过程中发现调用ajax请求耗时过长,今天来排查,发现浏览器请求/finance/ajax/freeze/ajaxGetShopLists时,对 ...
- 一次flume exec source采集日志到kafka因为单条日志数据非常大同步失败的踩坑带来的思考
本次遇到的问题描述,日志采集同步时,当单条日志(日志文件中一行日志)超过2M大小,数据无法采集同步到kafka,分析后,共踩到如下几个坑.1.flume采集时,通过shell+EXEC(tail -F ...
- 『审慎』.Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历
异步Task简单介绍 本标题有点 哗众取宠,各位都别介意(不排除个人技术能力问题) —— 接下来:我将会用一个小Demo 把 本文思想阐述清楚. .Net 4.0 就有了 Task 函数 —— 异步编 ...
- Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历
Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历 https://www.cnblogs.com/shuxiaolong/p/DotNet_Task_BUG.html 异步Task简单 ...
- 如何通过 Docker 部署 Logstash 同步 Mysql 数据库数据到 ElasticSearch
在开发过程中,我们经常会遇到对业务数据进行模糊搜索的需求,例如电商网站对于商品的搜索,以及内容网站对于内容的关键字检索等等.对于这些高级的搜索功能,显然数据库的 Like 是不合适的,通常我们采用 E ...
- 真实本人亲测Elasticsearch未授权访问漏洞——利用及修复【踩坑指南到脱坑!】
如要转载请注明出处谢谢: https://www.cnblogs.com/vitalemontea/p/16105490.html 1.前言 某天"发现"了个漏洞,咳咳,原本以为这 ...
随机推荐
- 阿里云ECS服务器CentOS7.2安装Python2.7.13
阿里云ECS服务器CentOS7.2安装Python2.7.13 yum中最新的也是Python 2.6.6,只能下载Python 2.7.9的源代码自己编译安装. 操作步骤如下: 检查CentOS7 ...
- 如何解决macbook pro摄像头不工作的问题
背景:上周用qq视频聊天都正常,这周突然显示检测不到摄像头.打开facetime和photo booth也显示“相机未连接”排查一切问题后只好给苹果客服打电话,在客服的帮助下解决了这个问题. 解决办法 ...
- mysql备份、还原数据库(命令行)
这里记录下MySQL如何通过命令行备份和还原数据库. 简单的三个步骤 方法很简单,可以分为三个步骤: 1.打开cmd控制台(命令行). 2.输入相应命令完成备份还原操作. 3.关闭cmd控制台. 就和 ...
- C# 获取所有可用的打印机
C# 获取所有安装了的打印机代码如下: using System.Drawing.Printing; var printers = PrinterSettings.InstalledPrinters; ...
- 学习笔记之知识图谱 (Knowledge Graph)
Knowledge Graph - Wikipedia https://en.wikipedia.org/wiki/Knowledge_Graph The Knowledge Graph is a k ...
- ES6 对象的拓展(三)
一.对象中的属性及方法1.属性属性简写:当对象属性名与属性值变量相同可以简写eg: let [name,age]=['nzc','18']; let obj = { name:name, age:ag ...
- 开机注册联通2G网络
2/3G PLMN LIST 在MM_RATCM_PLMN_LIST_CNF或NWSEL_MM_PLMN_SEARCH_CNF消息中可以查看2,3G搜到的PLMN LIST 内容如下: RAT:Rad ...
- MySQL单表数据不要超过500万行:是经验数值,还是黄金铁律?
本文阅读时间大约3分钟. 梁桂钊 | 作者 今天,探讨一个有趣的话题:MySQL 单表数据达到多少时才需要考虑分库分表?有人说 2000 万行,也有人说 500 万行.那么,你觉得这个数值多少才合适呢 ...
- python循环删除列表元素留一个问题
https://www.cnblogs.com/baihualin/p/10698651.html 引用up
- 使用Deployment控制器创建Pods并使Service发布到外网可访问
由于NFS支持节点共同读取及写入,所以可使用Deployment控制器创建多个Pod,并且每一个Pod都共享同一个目录 k8s-master kubnet@hadoop2 volumes]$ vim ...