1.response buffering
这个是优化对于http 1.1 的pipeline,会有多个request和response的请求。如下图
原始go http server的处理伪代码如下
工作模式很简单,这个链接有读事件,就读取请求,然后处理请求,然后响应给客户端,可以看到如果是pipeline方式的话,会多次调用read 和 write系统调用。
所以fasthttp用了个buffer,缓冲response数据,等到请求数据没了的话,再一起发送给客户端,代码如下
优点:
1.减少了recv系统调用,合并多个小请求通过一个recv系统调用
2.减少了send系统调用,合并多个小响应通过一个send系统调用
这里要简单介绍下bufio的原理:`bufio.Reader`的基本工作原理是使用一块预先分配好的内存作为缓冲区,发生真实IO的时候尽量填充缓冲区,调用者读取数据的时候先从缓冲区中读取,从而减少真实的IO调用次数,以起到优化作用。
即平常的话,我们是发送系统调用,切到内核,读数据,然后再切到内核态,这样一次次切。
而bufio的话,应该是切到内核态一直接受数据,直到buffer满或者遇到了指定截断的字符。(这个地方,可能就需要自己代码里来切割 http 请求了,安装http 协议的一些换行,回车啊来切分)。
缺点:
1.延迟响应,会让客户端感觉慢
2.http 1.1 pipeline支持的server比较少,大部分会禁用,一般难以用到
2.deferring http headers parsing
fasthttp会延迟解析http headers,直到他们被需要。它仅搜索htttp header的末尾标记(\r\n),然后把这个未被解析的头部数据,从输入buffer拷贝到一个byte slice中。这个 byte slice只当第一次需要访问http header的时候会解析成http header。
上面这段代码,没有读取http header,所以http header不会被解析的
上面的这段代码就会解析http headers
3.slice instead of maps for (key->value) entries
fasthttp使用slice 替代map 存储下面的实体
1.http headers
2.query args
3.cookies
这个slice 实现如下
<