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

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

前言


在程序员的系统开发中,有些开发是从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;
    }


目录
相关文章
|
开发框架 算法 安全
RFID 卡片型号及卡号获取 | 学习笔记
快速学习 RFID 卡片型号及卡号获取
RFID 卡片型号及卡号获取 | 学习笔记
|
iOS开发
Xcode报错解决方法:ld: symbol(s) not found for architecture arm64
Xcode报错解决方法:ld: symbol(s) not found for architecture arm64
4152 0
|
传感器 监控 API
基于STM32的智能灌溉系统设计与实现
基于STM32的智能灌溉系统设计与实现
1525 1
|
缓存 安全 JavaScript
前端安全:Vue应用中防范XSS和CSRF攻击
【4月更文挑战第23天】本文探讨了在Vue应用中防范XSS和CSRF攻击的重要性。XSS攻击通过注入恶意脚本威胁用户数据,而CSRF则利用用户身份发起非授权请求。防范措施包括:对输入内容转义、使用CSP、选择安全的库;采用Anti-CSRF令牌、同源策略和POST请求对抗CSRF;并实施代码审查、更新依赖及教育团队成员。通过这些实践,可提升Vue应用的安全性,抵御潜在攻击。
1842 0
|
5月前
|
存储 JSON 算法
京东商品 SKU 信息接口技术干货:数据拉取、规格解析与字段治理(附踩坑总结 + 可运行代码
本文详解京东SKU接口对接核心技术:涵盖高精度参数校验(如SKU ID纯数字、时间戳格式)、权限申请要点(认证材料、用途合规说明)、MD5签名生成(空值过滤、ASCII排序)、规格编码解析与区域库存处理,并总结7类高频坑及解决方案,附可直接运行的Python客户端代码。
|
自然语言处理 负载均衡 算法
推理速度提升300%:LLaMA4-MoE的FlashAttention-2集成与量化部署方案
本文详解LLaMA4-MoE模型架构与实现全流程,涵盖语料预处理、MoE核心技术、模型搭建、训练优化及推理策略,并提供完整代码与技术文档,助你掌握大模型MoE技术原理与落地实践。
700 6
|
8月前
|
网络协议
怎么选 Socks5 的 TCP 和 UDP 协议?
Socks5代理支持TCP与UDP协议:TCP面向连接、可靠稳定,适用于网页浏览、文件传输;UDP无连接、速度快,适合在线视频、游戏等实时场景。用户应据需求选择,以平衡稳定性与实时性。
|
编译器 API Android开发
Android经典实战之Kotlin Multiplatform 中,如何处理不同平台的 API 调用
本文介绍Kotlin Multiplatform (KMP) 中使用 `expect` 和 `actual` 关键字处理多平台API调用的方法。通过共通代码集定义预期API,各平台提供具体实现,编译器确保正确匹配,支持依赖注入、枚举类处理等,实现跨平台代码重用与原生性能。附带示例展示如何定义跨平台函数与类。
903 0
|
存储 编解码 算法
基于FPGA的直接数字频率合成器verilog实现,包含testbench
本项目基于Vivado 2019.2实现DDS算法,提供完整无水印运行效果预览。DDS(直接数字频率合成器)通过数字信号处理技术生成特定频率和相位的正弦波,核心组件包括相位累加器、正弦查找表和DAC。相位累加器在每个时钟周期累加频率控制字,正弦查找表根据相位值输出幅度,DAC将数字信号转换为模拟电压。项目代码包含详细中文注释及操作视频。
|
网络虚拟化
VLAN实现二层流量隔离(mux-vlan)应用基础配置
VLAN实现二层流量隔离(mux-vlan)应用基础配置
588 1

热门文章

最新文章