undefined

json 使用 easyjson 提升性能
string 拼接使用 stringbuild

go test -bench=. -cpuprofile=cpu.prof

sync.Map

  1. 适合读多写少,且Key相对稳定的环境
  2. 采用空间换时间的方案,并且采用指针的方式间接实现值的映射,所以存储空间比较大

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 其实是一个好方式,出现未知错误,则重启

构建可恢复的系统

  1. 拒绝单体系统
  2. 面向错误和恢复的设计
    1. 在依赖服务不可用时,可以继续存活
    2. 快速启动
    3. 无状态

与客户端协商,太古老的技术

混沌工程:
if something hurts, do it more oiften! 如果问题经常发生人们就会学习和思考解决它的方法
chaos Engineering

书籍推荐
面向模式的软件架构(模式系统)
计算机程序的构造和解释