一次线上优化引发生产问题的思考

简介: 一次线上优化引发生产问题的思考

前言


在程序员的系统开发中,有些开发是从0到1的系统开发,有些开发是从1到100的系统开发,有些开发是为了保证系统更好、更稳定运行的优化。

从0到1的开发和从1到100的开发,是为了系统更好的实现功能,需要快速迭代,可以不断的优化、上线、再优化、再上线。

优化需求,是为了更好的使用系统,让系统更好、更稳定的运行,但是优化不能够影响到原有线上的功能,但是我们需要优化。为了防止优化过程中影响到其他代码,这里有几个总结的方案可供参考。


使用开关配置


目前我们项目中配置中心使用的是Apollo,其他配置中心或者配置文件也是同样的道理。


  • 优点:①可配置化,②可以直接防止优化代码报异常影响到原来的逻辑
  • 缺点:开关是一刀切,要么走优化逻辑,要么不走优化逻辑
public static void main(String[] args) {
        // 这里可以使用开关配置,如果有问题可以使用开关及时关掉
        String switchKey = ApolloUtil.getProperty("business_key", "false");
        if (Boolean.TRUE.toString().equalsIgnoreCase(switchKey)){
           // 优化逻辑
        }
        // 原来业务逻辑
    }


使用 try-catch

  • 优点:即使优化代码出现异常也会直接出现的异常吞掉
public static void main(String[] args) {
        try {
            // 优化逻辑
        }catch (Throwable e){
          // 这里可以把优化逻辑代码出现的异常吞下,防止系统异常之类的
            log.error("the exception is {}", e.getMessage(), e);
        }
        // 原来业务逻辑
    }


随机调整


  • 优点:①类似于灰度发布,②可配置化,可以灵活调整比例
  • 缺点:影响部分用户的使用
public static void main(String[] args) {
        int limitNum = Integer.parseInt(ApolloUtil.getProperty("limitNum", "10"));
        // 10%, 90% 类似于灰度发布,可以逐步放开
        if (limitNum > Math.random() * 100){
            // 优化逻辑
        }
        // 原来业务逻辑
    }


联合使用


  • 核心:结合 try-catch 和可配置化
public static void main(String[] args) {
        String str = "";
        boolean flag = optimizationLogic(str);
        if (flag){
            // 根据 flag 为 true 情况下的逻辑
        }else {
            // 根据 flag 为 false 情况下的逻辑
        }
        // 原来的逻辑
    }
    /**
     * 优化逻辑,false 表示不走,true 表示走
     * @param code
     * @return
     */
    private static boolean optimizationLogic(String code){
        try {
            if (null == code || code.isEmpty()){
                return false;
            }
            String switchKey = ApolloUtil.getProperty("business_key", "false");
            if (Boolean.FALSE.toString().equalsIgnoreCase(switchKey)){
                return false;
            }
            // 优化逻辑
            return true;
        }catch (Throwable e){
            // 这里可以把优化逻辑代码出现的异常吞下,防止系统异常之类的
            log.error("the exception is {}", e.getMessage(), e);
        }
        return false;
    }


目录
打赏
0
0
0
0
8
分享
相关文章
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
261 0
go语言后端开发学习(六) ——基于雪花算法生成用户ID
SourceMap解析CLI工具实现(1)
前言 SourceMap 大家都不陌生了,通常情况就是产物里的xx.js.map文件里的内容。 可用于对压缩混淆后的代码还原,通常用于帮助定位源码问题。 区别于构建时的配置(以webpack 的devtool配置项为例)不同配置,source-map暴露的信息程度也就也不一样 一般公司里的项目,是会把.map文件上传到内网环境,不耽误问题排查,也不暴露源码 个人的开源项目,一般就没这么讲究了,直接和产物一起传了。 前端监控平台,一般都支持错误堆栈解析,通过.map,还原出错代码位置调用堆栈信息。 有时候没有自动解析的平台可用的时候(比如一些商用监控平台,免费版通常不提供自动source-map
NDK OpenGL ES 3.0 开发(六):EGL
EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口
675 0
NDK OpenGL ES 3.0 开发(六):EGL
【Minecraft开服】--- Windows搭建我的世界MC服务器「公网远程联机」
简单几步在windwos搭建我的世界服务器,并通过cpolar工具将本地服务暴露到公网连接
【Minecraft开服】--- Windows搭建我的世界MC服务器「公网远程联机」
Spring Boot 如何使用 @ExceptionHandler 注解进行局部异常处理
Spring Boot 如何使用 @ExceptionHandler 注解进行局部异常处理
红外雨量计(光学雨量传感器)检测降雨量,预防内涝
随着城市化进程的加快,城市内涝成为一个愈发严峻的问题。短时间内大量的降雨,不仅会给城市交通带来困难,也会对城市的基础设施和居民的生活造成很大的影响。因此,有效预防内涝也成为城市管理者和居民关注的焦点。
红外雨量计(光学雨量传感器)检测降雨量,预防内涝
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问