实习踩坑之路: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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>