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 的时候,缓存会导致连接的时候还是原来的那台机器,而不是弹性调度下真正的当前机器