AWS ALB - HTTP/2.0 적용하기
개요
- 현재 주로 사용중인 http/1.1 환경에서 벗어나 실제 http/2.0을 도입하기 위한 방법에 대한 문서화를 목표
- http/2.0 도입이 어려운 경우 http/1.1 환경을 개선하기 위해 고려해야할 부분에 대해 소개
목적
기존 게임 서비스에서 가지는 네트워크 환경을 개선하기 위해 http/1.1에서 발생하는 단점을 보완하기 위해 http/2.0 적용 검토를 진행
http/1.1에서 가지고 있든 단점은 크게 3가지이다.
- HOLB(Head Of Line Blocking) 문제
- multi connection establish로 인한 resource 비용 낭비
- 헤더 압축 불가
http/1.1과 2.0의 connection 생성 및 관리 형태 - (multi-flexing)
HTTP/1에서는 프로토콜 차원의 응답 다중화가 지원되지않았고 응답의 병렬 처리는 브라우저가 관리하는 형태이며 그렇기 때문에 브라우저의 정책에 따라 요청의 병렬처리가 가능한 개수가 달랐다.
하지만 HTTP/2는 출처 별로 128개의 병렬 요청을 처리할 수 있으므로, 하나의 큰 파일이 아닌 작은 여러 개의 파일로 나눠서 동시에 요청하고 받아올 수 있는 등의 HTTP/1.1에서는 하지 못했던 성능 개선이 가능하게 되었다.
http/2.0의 도입이 어려운 경우 기존의 http/1.1을 유지하되 connection pool 관리를 통해 기존 multi-connection resource 비용의 감소 및 도메인 샤딩을 통한 connection 관리가 가능하다.
** http/1.1 connection 관리의 중요성 : https://developer.mozilla.org/ko/docs/Web/HTTP/Connection_management_in_HTTP_1.x
클라이언트 http 2.0 사용하기
일반적으로 사용하는 웹서비스와 네이티브앱에서 http/2.0을 사용하기는 어렵지않다.
현재 사용하고 있는 http 라이브러리에서 http/2.0을 지원하고 있다면 별도의 작업이 필요 없으며, 라이브러리에서 지원하지 않는 경우 버전 업데이트가 필요하다.
대표적으로 안드로이드는 okHttp 2.5+, ios의 경우 내장 라이브러리에서 지원하고 있으며 서버에서 http/2.0을 지원하는 경우 자동으로 처리된다.
HTTP/2이 지원되는 Implementations는 다음과 같다.
Aerys | PHP | server | ALPN, Upgrade, direct | h2, h2c |
Akamai GHost | C++ | intermediary | ALPN, NPN | h2, h2-14 |
Apache HTTP Server 2.4.17+ | C | server | ALPN, Upgrade, direct | h2, h2c |
Apache Traffic Server v5.3.0 | C++ | intermediary | ALPN, NPN | h2, h2-14 |
Apache Tomcat 8.5+ | Java | Server | ALPN, Upgrade, direct | h2, h2c |
http4s-blaze | Scala | server | ALPN | h2, h2-14 |
Brocade Traffic Manager (formerly Riverbed/Zeus TM) | C++ | Server | ALPN, Upgrade, direct | h2, h2c |
Chatterbox | Erlang | Server, Client | ALPN | h2 |
Chromium | C++ | client | ALPN, NPN | h2, h2-14 |
Chicken Scheme hpack lib | Chicken Scheme | hpack | direct | h2-14 |
cl-http2-protocol | Common Lisp | client, server | NPN, direct | h2-14 |
curl and libcurl | C | client | ALPN, NPN, Upgrade | h2-14, h2c-14 |
Dart | Dart | client, server | ALPN, direct | h2 |
Deuterium | C | client, server | ALPN, direct | h2, h2-14, h2c, h2c-14 |
E2 Systems PATH | C | Client, Proxy, Server (Testing tool) | ALPN | h2 |
elixir-hpack | Elixir | HPACK | ||
Ericsson MSP | proxy | NPN, Upgrade, direct | h2, h2-14, h2c, h2c-14 | |
F5 | C | server, proxy | ALPN, NPN | h2-14 (11.6.0 HF2) h2 (upcoming release) |
GFE | C++ | intermediary | ALPN, NPN | h2 |
H2O | C | Server, proxy | ALPN, NPN, Upgrade, direct | h2, h2-14, h2-16 |
Haskell http2 lib | Haskell | HPACK, framing | ||
hpack | Erlang | HPACK | ||
hpack | Swift | HPACK | ||
http-2 | Ruby | server, client | ALPN, NPN, Upgrade, direct | h2, h2c, h2-17 |
http2 | Go | client, server | NPN, ALPN | h2, h2-14 |
HttpTwo | C# | client | direct | h2, h2c |
hyper | Python | client, server | NPN, ALPN | h2, h2-16, h2-15, h2-14 |
hyper | Rust | client | Upgrade | h2 |
Shaka Technologies Ishlangu Load Balancer | C, Java | server, proxy | ALPN | h2 |
Jetty | Java | client, intermediary, server | ALPN, Upgrade, Direct | h2, h2-17, h2-14, h2c, h2c-17 |
LiteSpeed Enterprise | C++ | Server | ALPN, NPN, Upgrade | h2, h2-17, h2-14, h2c |
lua-http | Lua | client, server | ALPN, direct | h2 |
Lucid | Erlang | Server | NPN, direct | h2, h2-16, h2-14 |
Microsoft | C/C++ | Client, Server | ALPN | h2 |
Microsoft Internet Explorer | client | ALPN (others?) | h2 (Windows 10 only?) | |
mod_h2 | C | Server | ALPN, Upgrade, direct | h2, h2c |
Mozilla Firefox | C++ | client | ALPN, NPN | h2-15, h2-14, h2 |
Netty | Java | client, server | ALPN, NPN, Upgrade, direct | h2, h2c |
nghttp2 | C | client, server, intermediary | ALPN, NPN, Upgrade, direct | h2, h2-16, h2-14, h2c |
Radware | C++/C | proxy, server | ALPN | h2 |
NGINX | C | server | ALPN, NPN, direct | h2, h2c |
node-http2 | NodeJS | server, client | ALPN, NPN, direct | h2 |
node-spdy | NodeJS | server, client | ALPN, NPN, direct | h2 |
OkHttp | Android, Java | mock server, client | ALPN, NPN | h2 |
Fast Android Networking | Android, Java | client | ALPN, NPN | h2 |
OpenLiteSpeed | C++ | Server | ALPN, NPN, Upgrade | h2, h2-17 , h2-14, h2c |
Protocol::HTTP2 | Perl | server, client | ALPN, NPN, Upgrade, direct | h2, h2c |
River | Elixir | client | ALPN | h2 |
Sasazka | NodeJS | server | NPN | |
second-transfer | Haskell | server | ALPN | h2-14, h2 |
ShimmerCat | Haskell | server | ALPN, Ahead Of Time Transfer Engine | h2 |
Swoole | PHP | server | ALPN, NPN | h2 |
Trusterd | C/mruby | client, server | ALPN, NPN, direct | |
C++ | server, client | ALPN, NPN | h2 | |
Undertow | Java | Server, Intermediary | ALPN, Upgrade | |
Vert.x | Java | Client, Server | ALPN, Upgrade, direct | h2, h2c |
WASD | C/OpenVMS | Server | ALPN, Upgrade, direct | h2, h2c |
Warp | Haskell | Server | ALPN, direct | |
Wireshark | C | other | ALPN, NPN, Upgrade, direct | |
WKWebView | Obj-C, Swift | client | ||
http2 | Go | server, client | ALPN, Upgrade | h2, h2c |
http/2.0 사용을 위해 AWS 설정하기
현재 aws에서는 ALB(application load balancer L7), cloudfront에서 http/2.0을 사용할 수 있도록 기능을 지원한다.
대부분의 게임 서비스에서 클라이언트는 게임 환경에 접속하기위해 도메인과 연결된 AWS ALB를 통해 접속 시도를 하고 있으며
퍼블릭 네트워크 환경 즉, 클라이언트와 ALB간의 네트워크 성능을 개선하는 경우 글로벌 서비스에서도 이점을 취할 수 있을것으로 예상된다.
ALB의 경우 별도의 설정은 필요없으며 http/2.0에 대한 요청이 들어온 경우 자동으로 처리된다.
** 프렌즈사천성의 경우 별도의 작업을 진행하지 않아도 ALB에서 http/2.0에 대한 처리가 가능하다**
설정에 대한 부분은 아래 링크를 참조
웹서버 http/2.0 설정하기
Http/2 적용하기 spring, nginx, apache
https://tecoble.techcourse.co.kr/post/2021-09-20-http2/
https://httpd.apache.org/docs/2.4/howto/http2.html
https://stackoverflow.com/questions/38612704/enable-http2-with-tomcat-in-spring-boot