实习踩坑之路:ElasticSearch双写数据不同步?不实时?怎么优化?

Posted 会写代码的花城

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实习踩坑之路:ElasticSearch双写数据不同步?不实时?怎么优化?相关的知识,希望对你有一定的参考价值。

问题复现

咳咳,说实话,这个挺尴尬的,那时前两天刚写的接口,我还特意写过一篇关于它的坑,没想到还是有隐藏的bug,废话不多说上图

这是上次的那个接口功能,就是查询未读会话有几个,不为0的话,会显示小红点
听起来很简单,但是今天就遇到了bug
问题是这样的,我们操作的时候,快速把所有会话点了一遍,然后给某个会话设置为了未读状态,发现就对不上了,显示还都是0,理应有未读数1的,因为我刚把这个(某个)会话设置为了未读状态,推了一条系统消息的(xxx设置了未读),但是从ES查询的结果却是没有未读会话,这个第一时间肯定能想到是数据没有同步过来,那么这样怎么优化呢?

思路

1.前端多一定的延迟,不要点开那个会话窗口的时候立马掉这个查询未读会话的接口,让他停个100ms行不?
2.后端ES的双写看看是不是异步去刷数据的,能不能改成同步
3.这个接口其实只需要查询有没有未读会话就行了,不需要吧未读的数量全部查询出来

方案一:前端延迟,但是人家前端说已经延迟了500ms都不行,现在延迟1200ms数据正常,这个方案不行,这个必须要后端介入优化了
方案二:看了我们的同步数据的线程,如果是异步多线程跑的,尽量改为同步多线程去刷新。
方案三:方案三其实就跟数据库的查询很类似,就是Limit 1,限制我查到一条符合数据的结果我就中断ES的查询,直接返回,然后这个接口也不返回具体数量了,直接返回true/false就行,有未读就返回true,没有未读会话就返回false
这个方案ES的实现思路就是ES的分页,给ES的from参数设置为0,size设置为1,也就是说从第0页0条开始,查询到符合1条第数据直接返回,不再进行其他的查询操作,等同于mysql的Limit 1

以上是关于实习踩坑之路:ElasticSearch双写数据不同步?不实时?怎么优化?的主要内容,如果未能解决你的问题,请参考以下文章

实习踩坑之路:一个诡异的SQL?PageHelper莫名多了一个Limit子句,导致SQL执行错误?

实习踩坑

MySQL数据同步ES的常用思路和方法

webpack之polyfill踩坑之路

配置taBar所遇见的问题(踩坑之路)

webpack踩坑之路——构建基本的React+ES6项目