json 使用 easyjson 提升性能
string 拼接使用 stringbuild
go test -bench=. -cpuprofile=cpu.prof
sync.Map
- 适合读多写少,且Key相对稳定的环境
- 采用空间换时间的方案,并且采用指针的方式间接实现值的映射,所以存储空间比较大
concurrent map: 分区、RWLock
GC:
避免内存分配和复制
复杂对象尽量传递引用,数组的传递和结构体的传递
初始化至合适的大小,自动扩容是有代价的。
复用内存
只要在程序执行之前加上环境变量 GODEBUG=gctrace=1 就可以看到 GC 的日志
如:GODEBUG=gctrace=1 go test -bench=.
go test -bench=xxx -trace=trace_val.out
go tool trace trace_val.out
字符串连接
bytes.buffer 性能一般
fmt.sprintf 性能较差
stringbuilder 性能较好
string+= 性能不够好
面向错误的设计:
隔离:隔离错误-设计、隔离错误-部署
冗余、限流
给阻塞操作都加上一个期限
错误传递:断路器
面向恢复的设计:
健康检查:注意僵尸进程、池化资源耗时、死锁。一般使用 http/tcp ping、检查进程存在。需要ping到关键路径。如果进程变成僵尸进程,进程是存在的,
Let it Crash 其实是一个好方式,出现未知错误,则重启
构建可恢复的系统
- 拒绝单体系统
- 面向错误和恢复的设计
- 在依赖服务不可用时,可以继续存活
- 快速启动
- 无状态
与客户端协商,太古老的技术
混沌工程:
if something hurts, do it more oiften! 如果问题经常发生人们就会学习和思考解决它的方法
chaos Engineering
书籍推荐
面向模式的软件架构(模式系统)
计算机程序的构造和解释