这是我参与「第五届青训营 」伴学笔记创作活动的第 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后进先出