我们在开发web服务时,会用类似jedis客户端连接redis服务器,会在配置文件中加入redis集群地址。不过当系统遇到redis负载太高,或者redis的数据需要扩容,就需要增加redis服务器。这时就需要重新把配置文件中的redis集群更改,再重启应用。
上面的方式是否太low了,都需要重新启动应用,那么多的应用都需要重启,是不是很麻烦,而且如果在无法区分业务的情况下,还不知道重启哪些业务应用。
如何发现异常
因为不同的业务,不同的团队,不同的开发人员在真实业务场景中,我们管理者是无法避免bug存在的,**也无法预测线上会发生什么样的问题?**如:发现redis集群有不稳定情况,cpu负载非常高,那我们怎么知道是哪个业务导致的呢?
这个是非常重要的,因为这个是公共的redis集群,一旦这个集群挂了,会影响整个业务。
如何截断异常
当我们在生产环境中,发现异常是由哪个业务产生时,或者是哪个应用服务器产生的,那如何很快速截断的让有问题的业务和应用服务器,先不让他们访问我们公共redis集群,等排查出原因在恢复他们的访问权限。
解决方案
小伙伴看到这里,感觉怎么样?是不是工作中,没有想过这些问题,工作中就直接按照网上的介绍先拿来用了。
现在是不是心里在想,怎么去解决上面的问题?
老顾这里介绍一下解决思路,具体整个代码等老顾的开源项目rb-cache上线后,会分享给大家。
区分业务
这个问题解决相对比较简单,就是对我们现有的客户端工具,进行二次封装,
上图就是定义一个二次封装接口
其实原理就是强制在方法中,要开发人员赋予业务区分,每个业务都是在开发前,管理人员定下来的,这个管理就比较简单了。
如果项目管理中,对业务的划分比较合理的话,可以在外面再封装一个简单的方法,把business业务放在配置文件中,这样就不需要每次都要传business这个参数了。
优雅扩容
解决这个问题,其实原理比较简单,就是程序如果能够知道redis集群地址产生了变化,重新设置一下jedis客户端的连接配置。现在的问题就是如何知道redis集群地址发生了改变?
我们可以采用把redis的集群地址配置在zookeeper中,应用在启动的时候,获取zk上的集群地址的值,进行初始化。如果想要改变集群地址,要在zk上面进行设置。
zk重要的特性就是监听特性,节点发生变化,就会立刻把变化发送给应用,从而应用获取到值,重新设置jedis客户端连接
发现异常
发现异常这个问题,其实就是一个监控的问题,我们需要把各个客户端使用redis的情况进行监控。怎么监控?
需要一个监控工具,这个监控工具网上有几个,推荐使用小米的open-falcon,自行搭建改监控系统,搭建比较复杂,但功能比较强大,很多公司都在使用。
当然小伙伴们可以用别的监控工具,只要数据上报协议,和监控报表输出功能即可,当然也要有报警的功能,及时给运维人员报告
再使用Aop拦截redis操作类,拦截redis操作,把相关数据进行封装。每隔1分钟把这些数据上报到open-falcon平台中。具体监控什么数据,由业务决定,一般要把设置的key,业务,操作时长,哪个客户端IP发起的,都需要监控。
在可以设置相关的报警规则,如:某个key一直被调用,在一段时间内操作次数太高。这样就可以方便排查哪些key导致cpu负载太高,就可以去看一下设置这个key的代码,有没有什么问题?是不是死循环等问题?
截断异常
在上面的发现异常的基础上面,如果发现某些业务应用,不正常,就可以立即发起截断该客户端的请求,这样可以保证其他业务不受影响。这里我们使用客户端方式去实现截断。原理也很简单,在redis二次封装的类中,我们需要判断本机是否在黑名单中,如果存在,则无法操作方法,或报异常。
如何知道黑名单的变化,跟优雅扩容那个redis集群地址的改变,方案一样。
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
最后
给大家送一个小福利
附高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。
面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。
[外链图片转存中…(img-9IQV10iY-1711152701433)]