FastHTTP
FastHTTP
缓冲HTTP响应
利用 bufio 一次性读取多个请求,处理完之后一次写入多个响应 减少 received 系统调用次数,提高吞吐量
带来的问题:如果某一个请求的处理比较耗时,那么它会拖累其他同一批处理的请求的时延,从而影响到整个系统的 latency
其中的一个坑是因为缓冲读取器的预读特性,我们需要把缓冲读取器创建在 for 死循环外部,以此来防止数据漏读
延迟解析 HTTP header 的内容
懒加载,减少不必要的 CPU 时间占用
使用 slice 而不是 map 来进行 kv 操作
使用 byte slice 来进行 kv 操作的好处是大大减少了内存分配和占用(相比于使用 map),同时达到 zero allocate 的目的,惰性内存分配(不断地重用自身),涉及比较的时候将 byte 的 key 转成 string 与待查询 key 进行等值比较判断查找 value 的 byte效果比使用 map 更好,slice 本身也方便进行内存重用
在header,cookie 映射中尤其有用,因为多数情况下这些键的数量很小 使用 slice 还可以保持 entry items 的原始顺序
缺点:
- 使用 slice map 查询的时间复杂度是 O(N),使用 map 的复杂度是 O(1)
- 偶尔大的 key 在分配 byte 的时候会占用大量的内存,而且又不释放,久而久之会造成内存碎片(申请很多内存但是大部分情况下只使用少部分)
重用 RequestCtx 请求上下文对象
先从对象池中获取,使用之前进行 reset ,使用之后归还到对象池中
缺点:依然会存在内存碎片
DNS 缓存
缓存 host地址到 ip 的映射,减少 DNS 解析时间
缺点:不适用 DNS 经常改变的情景下,例如: K8S 重启 pod 的时候,缓存会导致连接的时候还是原来的那台机器,而不是弹性调度下真正的当前机器