guard 是一个高性能熔断器+代理
RT。上周末发了 https://www.v2ex.com/t/424778#reply14
然后最近几天一直在迭代。从把锁丢掉,到重写 radix tree 和融合统计模块,到把 net/http 换成 fasthttp,
在我的笔记本上,QPS 从 7k 左右到了 22k,对比 Nginx,性能从 Nginx 的 0.55 到 1.76 倍。改写的过程非常
累,因为写好的测试需要一遍一遍推翻重写。数据结构也需要仔细设计。hot-path 需要非常注意避免性能问题。
但是改写的过程也学到了很多东西,例如怎么去优化 Go 的性能,期间尝试了 prefork 模式,减少锁,缩小临界区,使用 CAS,调整 GOGC参数 等等等等。
项目链接:
https://github.com/jiajunhuang/guard
核心模块的设计基本上已经稳定了,接下来要做的事情是:
- 改写
time.Now,使用自己维护的粗略时间以减少性能损耗 - 将 radix tree 中的 path 和索引改为[]byte,以便进一步降低 string 和[]byte 之间转换的损耗
- 嵌入 viper,以便提供动态配置更改的功能
- graceful restart
欢迎大家关注和 star,以及提出意见,建议和 PR !