毕业生就业推荐表模板网站开发,1个云虚拟主机怎么做多个网站,购物网站后台管理模板,asp.net网站开发实战#x1f4e2; 大家好#xff0c;我是 【战神刘玉栋】#xff0c;有10多年的研发经验#xff0c;致力于前后端技术栈的知识沉淀和传播。 #x1f497; #x1f33b; 近期刚转战 CSDN#xff0c;会严格把控文章质量#xff0c;绝不滥竽充数#xff0c;如需交流#xff… 大家好我是 【战神刘玉栋】有10多年的研发经验致力于前后端技术栈的知识沉淀和传播。 近期刚转战 CSDN会严格把控文章质量绝不滥竽充数如需交流欢迎留言评论。 文章目录 写在前面的话背景说明方案介绍具体实现总结陈词 写在前面的话
笔者所在公司由于存在大量业务场景是借助Redis缓存实现的因此缓存的健康状态对框架整体的影响较大。 针对这一问题在框架封装过程中采用了基于 Lettuce 事件总线实现的缓存容错策略和环境监测。 本篇博文鉴于此方案展开描述让我们絮絮道来。 背景说明
在高并发场景中通常会引入Reids缓存机制以此减轻数据库的查询压力增加系统吞吐量。 例如以Spring开发框架为例开发者通常会选择采用Cacheable等注解方式便捷实现缓存的快速利用。 在传统的开发模式下当Redis缓存宕机的时候该注解所标注的方法会直接抛出异常对功能调用方不太友好并且针对缓存环境恢复的情况下没有自动切换缓存策略的机制。开发人员往往要对单独接口进行缓存降级策略的编写往往容易出现疏漏。开发者即使采用其他缓存客户端代码的使用方式都不可避免的需要面对这个问题。 同时由于Redis集群部署成本较高部分企业并不会采用集群模式往往不能保障Redis的高可用。 综上所述Redis在宕机情况下的容错应对机制是框架设计人员必须要考虑的。
【Cacheable 技术简介】 Cacheable 是 Spring 自带的注解便捷操作缓存的。对于使用 Cacheable 标注的方法Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素如果存在就不再执行该方法而是直接从缓存中获取结果进行返回否则才会执行并将返回结果存入指定的缓存中。
【关于缓存容错策略增强】 传统使用Cacheable注解Redis方法时如果Redis服务器挂了就直接抛出异常了 java.net.ConnectException: Connection refused: connect 新框架对Spring的Cacheable功能进行了增强支持毫秒级故障自动降级与自动恢复已支持组件。 方案介绍
本方案通过自定义拓展 Spring 的RedisCacheManager 缓存处理器设置不同环境的缓存处理策略并且基于 Lettuce 的 EventBus 机制实现缓存环境监测和策略切换以此增强单机模式下的 Redis容错性。通过这种方式解决了传统缓存运用的弊端开发人员可以正常使用Cacheable当缓存宕机的话可以根据项目级配置指定想要的缓存策略比如按包装异常抛出策略、或执行原逻辑策略等。当缓存恢复的时候会自动恢复切换到正常的缓存策略不影响用户操作切换不需要人工干预。当然这一过程对业务开发人员也是不需要特别关注的开发人员只需要正常使用缓存场景不需要为单独接口考虑缓存降级策略。同时本方案支持采用延迟任务模式不断确保缓存健康状态下缓存处理器的正确性并做出相应响应。 具体实现
本方案自定义拓展缓存处理器基于 Lettuce 的 EventBus 机制实现缓存环境监测和缓存策略切换。完成了对缓存宕机情况下可以定制缓存容错策略。同时可以根据缓存环境的健康自动切换缓存策略增强了系统的稳定性减少了人工运维成本。 本方案的缓存服务端不局限于Redis缓存操作方式也不局限于Spring的Cacheable方式为方便理解下文暂以这两种模式声明。 Step1、自定义缓存管理器继承Spring自带的CacheManager在其构造函数中设置失败时的缓存处理器成功时缓存处理器当前激活缓存处理器等属性并重写获取缓存的相关方法同时新增同步缓存处理器的切换方法 Step2、定义失败时缓存处理器读取服务的项目级策略配置示例代码如下根据指定的缓存策略枚举激活对应的缓存容错策略
xxxx:cache:# degrade自动降级# 当Redis服务出现故障时不再查询Redis缓存直接执行原有的方法逻辑# fail_fast快速失败# 当Redis服务出现故障时调用被标记了Cacheable的方法将直接抛出 cache-fail-strategy: degrade Step3、同理类似步骤2定义成功时的缓存处理器 Step4、在程序初始化的时候利用Lettuce的客户端API检查缓存当前健康状态选择对应的缓存处理器为当前激活的缓存处理器 Step5、在程序初始化的时候利用Lettuce的EventBus事件总线监听机制包含但不限于监听ConnectionActivatedEvent和ConnectionDeactivatedEvent等事件并做出相应处理 Step6、当监听到ConnectionDeactivatedEvent事件时代表当前缓存状态异常此时将触发步骤1的自定义缓存管理器的up方法将失败时缓存处理器设定为当前激活状态此时若逻辑执行到Cacheable等注解方式标注的方法将根据缓存容错策略例如进行异常报错或直接执行原方法等 Step7、当监听到ConnectionActivatedEvent事件时代表当前缓存状态健康此时将触发步骤1的自定义缓存管理器的down方法将失败时缓存处理器设定为当前激活状态此时若逻辑执行到Cacheable等注解方式标注的方法将继续正常优先从缓存加载数据 Step8、同时在事件监听逻辑中利用ScheduledThreadPoolExecutor线程池的scheduleAtFixedRate方法开启间隔延迟任务不断检查缓存状态确保上述缓存切换的准确性并将结果输出日志 总结陈词
上文介绍了博主所在公司采用的缓存容错策略方案仅供参考。 从内容上看主要是方案介绍PS因为是技术交底书口吻编写有需要源代码的欢迎留言交流。 后续会逐步分享企业实际开发中的实战经验有需要交流的可以联系博主。