TsgcWebSocketHTTPServer | HTTP/2 서버 스레드

HTTP 1.1과 HTTP 2.0의 차이점은 아래를 참조하십시오.

 

HTTP 1.1

기존 HTTP 동작에서는 동일한 연결을 통해 여러 요청을 할 때 클라이언트가 다음 요청을 보내기 전에 각 요청의 응답을 기다려야 합니다. 이러한 순차적 접근 방식은 웹사이트 리소스의 로드 시간을 크게 증가시킵니다. 이 문제를 해결하기 위해 HTTP/1.1은 파이프라이닝이라는 기능을 도입하여 클라이언트가 서버의 응답을 기다리지 않고 여러 요청을 보낼 수 있게 합니다. 이에 따라 서버는 요청을 받은 순서와 동일한 순서로 클라이언트에 응답합니다.

 

pipelining이 해결책으로 보였지만, 다음과 같은 어려움에 직면했습니다:

 

 

 

HTTP/1.1을 지원하는 서버에서 페이지 로딩을 최적화하기 위해 웹 브라우저는 해결책을 구현했습니다. 서버에 6~8개의 병렬 연결을 열어 여러 요청을 동시에 전송할 수 있게 합니다. 이러한 병렬 처리는 파이프라이닝과 관련된 문제를 완화하고 전체 페이지 로드 시간을 개선하는 것을 목표로 합니다.

 

웹 브라우저가 6개에서 8개의 병렬 연결을 선택하는 것은 최적화 고려 사항에 근거합니다. 이 숫자를 선택하는 구체적인 이유에는 리소스 활용도, 네트워크 효율성, 잠재적 병목 현상 방지 사이의 절충이 포함될 수 있습니다.

 

 

HTTP 2.0

파이프라이닝에서 직면한 제약에 대응하여, HTTP/2는 multiplexing이라는 기능을 도입했습니다. 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;