漫谈http

前段时间,有人说可以用长连接取代http请求,这样是不是可以可以去掉http api限流了。

restapi

因为这个问题不能一句两句说清楚,所以没法直接在群里说,只能单独写出来说一下。

这里我就列两点:

  1. 长连接是可以提升性能,毕竟省去了每次http建连前的tcp三次握手。但是这里提升的性能跟http本身没有关系,一个restful api该多少时间返回还是多少时间返回,不会说用了长连接后这后端的响应时间就变快了。
  2. restful api不能去掉限流,因为这个限流是为了保护服务器的。我们好比restful服务器是一个收费站,它就是一秒处理一辆车的通过请求,所以无论这个收费站是在国道还是高速上收费,那都是1秒一辆,不会说高速上就变成一秒两辆了。这个只有提升收费站本身的效率以及看后面道路是否通畅才行。
  3. restful api限流是基于后端处理的速度,以及处理的逻辑来决定的,跟你前面链路是高速还是国道是没有半毛钱关系的。

resthttp

然后本来说的qps, 又开始说http1.0这些。那我们就好好说说http1.0, http1.1,http2.0在调用层面的差别。

http1.0的rfc: https://www.rfc-editor.org/rfc/rfc1945 标准发表于1996年

http.1.1的rfc: https://www.rfc-editor.org/rfc/rfc2616 标准发表于1999年

http2.0的rfc: https://www.rfc-editor.org/rfc/rfc7540.html https://www.rfc-editor.org/rfc/rfc9113 发表于2015年和2022年

通过rfc我们可以看看这3种协议在请求的时候性能到底是怎么样的。 我们假设总共发了3次http请求,http请求本身的响应时间是80ms, 从客户端到服务器端的往返时间(rtt)为30ms。

我们先计算下如果是http1.0的话,那总的3次请求是多少时间。首先是tcp的3次握手,然后在三次握手的最后一次ack的时候,客户端会同时发起一个http request请求,然后服务器端响应返回就好了,我们不需要计算后面fin的步骤。

http10wireshark

那3个请求的话,实际总计耗时为(30+80+30)*3=420ms

http10

我们再来看看http1.1大体是怎么样的,首先我们知道http1.1是使用keepalive来保持连接的,所以虽然是3个http请求,但是如果3个http请求是相同域名的话,那就会只进行一次tcp3次握手。

通过下图我们可以计算出3次请求总计耗时: 30 * 4 + 80 * 3 = 360ms

理论上比http1.0节省了60秒,节省的就是tcp握手的2次rtt时间。

http11

最后我们看看http2.0理论上是多少时间呢,http2.0是支持多路复用的。所以它理论上的请求时间是这样的。

通过下图我们很快的计算出来就是 30 * 2 + 80 = 140ms

http20

我们可以看到http2.0的多路复用是相当不错,在这个时候因为减少了来回的rtt,所以这个节省时间会比较多的。

但是这个时间只是理论时间,为什么这样说呢? 因为你看同时发了3个http request,我们是假定都是80ms返回,可实际情况是http server在接收3倍请求的时候,能否还以同样的延时来返回呢,这个其实是个未知数。

由于现在都是https的请求了,这里还得加上加解密的时间。