数据泵中间件的意义在于解耦,我司数据泵产品采用Maxwell。
几个月前在admin后台积分速报仪表盘查看会员单笔积分详情时页面无法展示,一直报connection timeout,正常展示出来的积分明细:
![d004cb008e6f45d0f6e4961cffaab0dc.png](https://img8.php1.cn/3cdc5/12bac/61b/e1a150c1602a3e73.png)
![93c92201d559db73bf2dabd71f6dc398.png](https://img8.php1.cn/3cdc5/12bac/61b/fc7c901353b3cc5c.png)
该问题除了发现开发人员本身没有对代码没有优化外,也思考着结合已有的ELK来解决统计和查询效率,原因在于订单、积分表数据量过大,业务先行导致模型设计存在一定的缺陷,java层处理关联数据查询&统计工作就相当耗时,改进架构如下:
![012502eaeb1373be4d2ffa6defdc0dbf.png](https://img8.php1.cn/3cdc5/12bac/61b/e9a08d1d3e30d43e.png)
上游java应用产生业务数据-》MySQL-》Maxwell-》Logstash-》ES-》反哺admin系统查询&统计
实施过程中遇到的问题:
1、全量数据导入(Logstash-jdbc解决,也可以使用Maxwell-bootstrap)
2、ElasticSearch去重计数存在5%误差(产品上容忍)
3、ElasticSearch From size限制10000条记录(放弃)
4、ElasticSearch Ractive searchAfter(改造产品设计,禁止分页跳页)
5、ElasticSearch Rest searchAfter(改造产品设计,禁止分页跳页)
6、ElasticSearch Rest scroll(放弃)
7、日期时间格式转换(Logstash这一层解决)
8、Webflux
容错处理:
java层设计一个静态代理service,在这里加一个开关放redis,可来回切换mysql、ES查询两种实现,应急ES使用不成熟问题
改造后查询性能提升显著:
![ff018593ad8f25750186d1ec21ab09c4.png](https://img8.php1.cn/3cdc5/12bac/61b/98e3511137e6be8d.png)
订单查询提升6倍左右(7200转硬盘,无缓存,首次查询)
![e7ad2df030703a89afe4e75d19db89c0.png](https://img8.php1.cn/3cdc5/12bac/61b/dc18d45cdba50995.png)
积分查询提升10倍左右(7200转硬盘,无缓存,首次查询)
待改进点:
1、我司除MySQL服务器配置SSD硬盘外,其他所有服务器硬盘均为7200转
2、数据预热(warm up new order),定时任务或者延迟任务查询ES最近一条数据,将冷数据加载到内存
3、java使用ES语法时尽可能采用filter,少用query,丢弃评分,将冷数据加载到内存
解耦的优点看到了,如果不用Maxwell+kafka怎么把数据同步到ES呢,很显然在下单、积分代码的逻辑尾部增加ES接口操作,想象一下1000行的下单逻辑和复杂的积分规则再增加额外代码的堆叠,即使不考虑漏单的情况,望着那么一坨代码,越看越像shit