本文简要解释框架设计中,涉及HTTP框架和Garbage Collection 的内容。
分代假说:直接地说,即大部分object死得早。
Go内存分配,采用分块方式
- 调用mmap()向OS申请一大块内存,如4MB
- 再将大块继续划分成特定大小的小块,用于对象分配
- nonscan mspan:分配不包含指针的对象—— GC 不需要扫描
- scan mspan: 分配包含指针的对象
- g->m->p->mcache->mspan->memory block->return pointer 分配路径长,较为耗时
优化方式 Balanced GC 每个g都绑定一大块内存(1KB),即goroutine allocation buffer
GAB 用于 nonscan 类型的小对象分配
使用三个指针进行GAB维护
HTTP框架与Go语言 网络分层设计的特点:
- 高内聚
- 低耦合
- 易复用
- 高扩展性 在Go语言中,常用的HTTP框架有Gin、Echo和Beego等。将HTTP请求解析,经后端路由、业务逻辑后,即可到达数据库。
HTTP框架包括HTTP1、HTTP2、QUIC三类。其中,HTTP1无状态无连接,采用明文传输且效率较低;HTTP2进行了头部压缩,二级制分帧;QUIC用UDP协议,并且克服了前两者存在的队头阻塞问题。
API设计:可理解性、简单性
中间件采用洋葱模型
实现中间件的另一种方式是路由器
协议层设计的代码如下:
type Server interface { Serve(c context.Context, conn network.Conn) error }
根据官方手册推荐,不要在结构体存储Contexts,将一个Context直接传递到每个方程
对于网路库优化方式有:
- 存下全部header
- 减少系统调用次数
- 能够复用内存
- 能够多次读
NIO可以解决BIO中等待过程中导致卡顿的问题
type Conn interface{ Read(b []byte)(n int, err error) Write(b []byte)(n int, err error) }
go net流式友好 小包性能高
netpoll 对中大包性能高
Header解析
找到Header line边界:\r\n 先找到\n再看它前一个是不是\r; 可以采用SIMD进行优化速度
热点资源池化 利:减少了内存分配;提高内存复用;降低垃圾分配压力;改善性能 弊:额外reset逻辑;请求内有效;问题定位不易