项目优化|青训营笔记

54 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天

业务服务优化

服务:能单独部署,承载一定功能

调用链路:一个接口请求所需要的依赖关系

 

优化流程

建立性能评估手段:服务性能评估方式(单纯的benchmark无法进行复杂的分析,不同负载表现不同),请求流量构造(不同请求覆盖的逻辑不同,线上真实情况不同),压测范围(单机器压测,集群压测),性能数据采集(单机数据、集群数据)

分析数据定位瓶颈(例如火焰图、高低并发对比)

优化项改造:线上请求数据录制回放(同样的请求数据再来一遍保证正确性)

效果验证:逐步放量、收集性能数据

 

进一步根据服务整体链路分析优化

基础库优化

基础库:公共工具包、中间件

分析基础库核心逻辑和性能瓶颈(设计完善改造方案、数据按需获取、数据序列化协议优化)、内部压测验证、推广业务服务落地验证

Go本身优化

优化内存分配策略、优化编译流程、内部压测验证、推广业务服务落地认证

错误处理

优先处理错误和特殊情况,尽量少的嵌套

 

简单错误表示

if a > 10 {

    return errors.New("this is an error")

}

如果有格式化要求可以fmt.Errorf,其中%w显示详细error跟踪链

return fmt.Errorf("错了 %w", err)

判断是否是某一错误

if errors.Is(err, fs.ErrNotExist) {//}

pathError不仅判断某一类型,而且能取出对应信息

 

panic(比较重大的错误,会崩溃),不建议使用,如果不用recover会崩溃

如果问题可以被解决,用error

在初始化阶段发生不可逆错误时可以在init或者main用panic

 

recover只能在defer中使用,且无法嵌套,只能作用于当前goroutine,后进先出

底层:去出当前goroutine结构体的_panic链表最新一个错误,如果没有返回nil

其中
debug.Stack()显式调用堆栈

 

defer会在函数返回前调用,多个defer后进先出