自研redis sdk支持自动dns切换(附源码)

大家好,我是烤鸭:

   标题起的有点大了,说是自研,其实就是个封装,不过倒是解决了dns切换的问题(虽然不太优雅)。

背景

之前做活动的时候,用域名链接的redis,当时做了主备集群,在主集群宕机的时候,可以自动链接到备用集群,发现不好使。具体原因可以看下我写的这篇。

https://blog.csdn.net/Angry_Mills/article/details/119218854

还有人留言说已经实现了。

在这里插入图片描述

不过也没找到代码,就着这个思路自己开发一个吧。

思路

就跟上面这个评论一样,既然没办法从池化的地方入手,就重建client吧,不过重建的过程一定会有一些损失。

  • 初始化redis的bean
  • aop切面监听异常
  • 达到指定条件,销毁并重建bean(指定异常出现多少次之类的)

开发测试

想测试的话,后边可以直接下载源码。

需要redis集群,搭建可以参考

https://blog.csdn.net/Angry_Mills/article/details/123139680

核心代码在切面,我这里使用aop实现的,这里用的重建逻辑也是比较简单的,判断超时10次,就会重建,为了方便复现,超时时间设置的5ms。

线上中需要考虑实际场景,比如超时时间的设置,以及超时次数,或者可以设置时间窗口(1分钟内超时100次之类的),再进行重建。

@Around("redisApi()")public Object doProfiling(ProceedingJoinPoint point) throws Throwable {log.info("进入aop===================="+errorCount);long initTime = System.currentTimeMillis();long sTime = initTime;String met = null; // 拦截方法名称Object args = null; // 拦截的方法参数Object ret = null; // 拦截方法返回值String clusterName = "";if (point.getTarget() instanceof MagRedisServiceImpl) {clusterName = ((MagRedisServiceImpl) point.getTarget()).getClusterName();}try {if (point.getArgs().length > 0) {//只取第一个参数args = point.getArgs()[0];}MethodSignature methodSignature = (MethodSignature) point.getSignature();met = methodSignature.getName();sTime = System.currentTimeMillis();//单独获取系统时间。减少对系统的交互。毫秒值。ret = point.proceed();} catch (Throwable t) {log.error(t.getMessage(), t);if(t instanceof RedisSystemException || t instanceof QueryTimeoutException && t.getCause() instanceof RedisCommandTimeoutException){log.info("redis 连不上了=========="+errorCount);errorCount ++;if (errorCount == 10) {rebuildRedisTemplate();errorCount = 1;}}throw t;//异常向上抛出} finally {}return ret;}

redis 链接正常的时候,多次访问

在这里插入图片描述

在这里插入图片描述

宕机redis后,第10次访问触发重建逻辑

在这里插入图片描述

切换本地dns后,访问正常

在这里插入图片描述

在这里插入图片描述

最后说一下

demo和线上使用还是有很大区别的,一般redis超时设置可能在100ms以内,如果设置的次数过多,可能超时的时间很长。

还是设置时间窗口+异常类型+超时次数,比较合理。

像RedisCluster is Down 这种的,可能要优先处理。

不过很少有主备集群同时存在,除非做活动或者比较重要的业务,中间件出问题的概率比服务要低很多(不过出了就是大问题)。

源码下载

https://gitee.com/fireduck_admin/redis-maggie-dns

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Canal实现redis和mysql的同步

使用Canal实现redis和mysql的同步 ### canal 工作思路 Canal 会将自己伪装成 MySQL 从节点(Slave),并从主节点(Master)获取 Binlog,解析和贮存后供下游消费端使用。Canal 包含两个组成部分:服务…

上线到凌晨4点半 pagehelper的bug?

大家好,我是烤鸭: 上上周末上线到凌晨4点半,哭了,没想到问题竟然如此简单。最近又懒惰了,写了开头就一直放着了,今天终于补上。 ​ 问题日志 Error querying database. Cause: com.github.pagehelper.P…

skywalking 引起 spring-cloud-gateway 的内存溢出 skywalking的bug

大家好,我是烤鸭: 又是个线上问题记录,这次坑惨了,开源软件也不是万能的,还是要做好压测和灰度。 问题 上游反馈大量超时,不止某一个服务,查看服务没有问题,猜测是网络或者环境问题…

长连接检测 监控的一点思考 java实现

大家好,我是烤鸭: 怎么监控长链接服务器的稳定,除了探活服务之外,怎么保证长链接的收发正常,这篇文章考虑下这个。 问题来源 运营反馈部分直播间无法收到弹幕、点赞消息,第一时间进行复现,发现…

rabbitmq 启动失败 dump日志分析

大家好,我是烤鸭: rabiitmq 突然宕机,并且无法启动。同事反馈测试环境 rabbitmq 有一个节点突然掉了,并且无法启动。 现象 集群有一个节点宕机。 去对应的机器上执行启动命令 ./rabbitmq-server -detached发现进程不在&#x…

《深入理解Java虚拟机》-读书笔记(第一、第二部分)

大家好,我是烤鸭: 《深入理解Java虚拟机》-读书笔记(第一、第二部分)。 第一部分:走进Java 第1章 走进Java 1.1 概述 摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想;…

nacos 返回 403 unknown user 太他么坑了 源码解析

大家好&#xff0c;我是烤鸭&#xff1a; nacos 真的是有点意思&#xff0c;有时候哪怕某个jar包版本冲突了都可能导致莫名其妙的错误&#xff0c;源码走一波吧。 当前版本 <dependencies><dependency><groupId>org.springframework.boot</groupId>&…

研发效能提升 maven依赖扫描 版本统一 漏洞版本提醒

大家好&#xff0c;我是烤鸭&#xff1a; 整点干货&#xff0c;代码级别的版本统一&#xff0c;以及漏洞版本的扫描。 背景 两个方面吧。 项目整体的架构不统一&#xff0c;springboot/cloud 配置/注册中心也用的不统一&#xff0c;版本更是五花八门&#xff0c;怎么快速的找…

Spring boot actuator端点启用和暴露

1.启用端点 默认情况下&#xff0c;除了shutdown端点是关闭的&#xff0c;其它的都是启用的。配置一个端点的启用&#xff0c;使用management.endpoint..enabled属性&#xff0c;下面的例子是启用shutdown端点&#xff1a; management.endpoint.shutdown.enabledtrue如果你个人…

java执行sql慢 navicat不慢 见鬼了

大家好&#xff0c;我是烤鸭&#xff1a; 有点意思的问题&#xff0c;代码提示接口超时(10s)&#xff0c;接口逻辑很简单&#xff0c;就一个sql查询。本来也想是sql慢&#xff0c;可是拿sql去Navicat执行下&#xff0c;一点不慢(50ms)。 环境 DB&#xff1a;SqlServer 连接池…

windows docker mongodb

大家好&#xff0c;我是烤鸭&#xff1a; 今天翻博客&#xff0c;发现4年前的一篇草稿&#xff0c;抽空给完善下。原本草稿写的是linux下mongo使用&#xff0c;还有java的一些api&#xff0c;现在就用容器实现下。 容器部署 官方网站&#xff1a; https://www.mongodb.com/ w…

Is the byte array a result of corresponding serialization for DefaultDeserializer

大家好&#xff0c;我是烤鸭&#xff1a; 问题记录&#xff0c;上线之后懵逼的问题。只能回滚?每次都是上线来暴击&#xff0c;不然多查查文章也不至于这么被动。 报错日志 org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nes…

容器环境 springcloud gateway grafana prometheus采集集成与问题

容器环境 springcloud gateway grafana prometheus采集集成与问题 大家好&#xff0c;我是烤鸭&#xff1a; 记录下网关上容器后&#xff0c;监控升级的过程。 原来的方式 grafana 和 prometheus 网上教程很多&#xff0c;就不细写了。 没上容器之前&#xff0c;可以在…

easyui Combotree 怎么加载数据 支持多选

1、开发环境vs2012 mvc4 c# 2、HTML前端代码 <% Page Language"C#" AutoEventWireup"true" CodeBehind"DataGridTest.aspx.cs" Inherits"MvcAppTest.DataGridTest" %><!DOCTYPE html><html xmlns"http://www.w3.…