TsgcWebSocketHTTPServer | HTTP/2 服务器线程

请参阅以下 HTTP 1.1 和 HTTP 2.0 之间的差异:

 

HTTP 1.1

在传统 HTTP 行为中,通过同一连接发出多个请求时,客户端必须等待每个请求的响应后才能发送下一个请求。这种顺序方式会显著增加网站资源的加载时间。为解决此问题,HTTP/1.1 引入了流水线功能,允许客户端在不等待服务器响应的情况下连续发送多个请求。服务器则按照接收请求的顺序依次响应客户端。

 

尽管流水线看似是一种解决方案,但它面临以下挑战:

 

 

 

为了优化支持 HTTP/1.1 的服务器的页面加载速度,Web 浏览器实现了一种变通方案:向服务器并行打开六到八个连接,从而同时发送多个请求。这种并行化旨在缓解流水线相关问题并提升整体页面加载速度。

 

Web 浏览器选择六到八条并行连接是基于优化方面的考量。选择该数字的具体原因可能涉及资源利用率、网络效率与避免潜在瓶颈之间的权衡。

 

 

HTTP 2.0

为解决管道化(pipelining)遇到的限制,HTTP/2 引入了多路复用(multiplexing)功能。多路复用 通过支持更高效的通信,实现了客户端与服务器之间通过并发传输多个请求和响应 在单一连接上的交互。

 

HTTP/2 使用二进制分帧机制,这意味着 HTTP 消息被分解为称为帧的更小独立单元。这些帧可以在连接上交错发送,彼此独立。在接收端,帧被重新组装以重建原始 HTTP 消息。

 

这种二进制分帧机制是实现 HTTP/2 多路复用的基础。它使浏览器能够在同一连接上发送多个请求,而不会遇到阻塞问题。因此,Chrome 等浏览器对 HTTP/2 请求使用相同的连接 ID,从而在客户端和服务器之间实现高效、不间断的通信。

本质上,HTTP/2 的多路复用功能由二进制分帧机制实现,通过在单个连接上并发传输多个请求和响应,提升了客户端与服务器之间的数据交换效率和速度。

 

 

TsgcWebSocketHTTPServer

为了提高 HTTP/2 协议的性能,每次服务器收到新的 HTTP/2 请求时,默认在线程池(默认 32 个线程)中调度请求。这避免了单个连接发送多个并发请求时所需的顺序处理(在连接线程上下文中)造成的等待。

 

线程池的行为可通过以下属性进行配置。

 

 

精细调整请求,选择哪些请求必须在线程池中处理(因为它们耗时较长),哪些可以在连接线程中处理,您可以使用事件 OnHttp2BeforeAsyncRequest。此事件在将请求排入线程池之前触发。使用参数 Async 设置请求是否为线程化。

 


procedure OnHTTP2BeforeAsyncRequest(Sender: TObject; Connection: TsgcWSConnection; const ARequestInfo: TIdHTTPRequestInfo; var Async: Boolean);
begin
  if ARequestInfo.Document = '/fast-request' then
    ASync := False;
end;