๊ธฐ์กด์ ๊ฐ๋ฐํ๋ ์๋น์ค์์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ํต์ ์ websocket ์ผ๋ก ๊ตฌํํ๋ค.
๋ค ๋๋ด๊ณ ๋์ ํด๋ผ์ด์ธํธ, ์๋ฒ ํต์ ํ๋ ๋ฐฉ๋ฒ์ ์ข ๋ ์์นํด๋ณด๊ณ ์ถ์๋ค
๊ทธ๋ ๊ฒ ์๊ฒ๋ gRPC. ์ ๋ฆฌํด๋ณด์
โ gRPC์ WebSocket
gRPC์ WebSocket์ ๋ ๋ค ๋คํธ์ํฌ ํต์ ํ๋กํ ์ฝ๋ก, ์ค์๊ฐ ๋ฐ์ดํฐ ์ ์ก๊ณผ ํด๋ผ์ด์ธํธ-์๋ฒ ๊ฐ ์ํธ์์ฉ์ ๊ฐ๋ฅํ๊ฒ ํจ
- gRPC
- Google์ด ๊ฐ๋ฐํ RPC(Remote Procedure Call) ํ๋ ์์ํฌ
- HTTP/2 ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ฉฐ, ํ๋กํ ์ฝ ๋ฒํผ(Protocol Buffers, Protobuf)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ง๋ ฌํ๋ฅผ ์ํ
- ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฏ์ด ์๊ฒฉ์ผ๋ก ๊ธฐ๋ฅ์ ์คํ
- WebSocket
- HTML5 ํ์ค์ผ๋ก, TCP ์์ผ ์ฐ๊ฒฐ์ ํตํด ์๋ฐฉํฅ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํจ
- ํ๋กํ ์ฝ์ HTTP์์ ์ ๊ทธ๋ ์ด๋ ํ ์ง์์ ์ธ ํ ๋ํ๋ ์ค ์ฐ๊ฒฐ์ ์ ๊ณต
gRPC
๐ gRPC๋ฅผ ์ฌ์ฉํด์ผ ํ ๋
- ๊ณ ์ฑ๋ฅ์ด ํ์ํ ๊ฒฝ์ฐ
- ๋ฎ์ ๋์ญํญ ์ฌ์ฉ : *Protobuf๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ด์ง(binary) ํ์์ผ๋ก ์ง๋ ฌํํ๋ฏ๋ก JSON์ด๋ XML๋ณด๋ค ๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ์๋ค.
- ๋ฎ์ ์ง์ฐ ์๊ฐ : *HTTP/2์ ๋ฉํฐํ๋ ์ฑ๊ณผ ํค๋ ์์ถ ๋๋ถ์ ์ง์ฐ ์๊ฐ์ด ์ ๋ค.
- ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ ํต์
- ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์์ ๊ฐ๋ณ ์๋น์ค ๊ฐ ํต์ ์ด ๋น๋ฒํ ๊ฒฝ์ฐ
- ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ
- ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ ์ค์๊ฐ ๋ฐ์ดํฐ ๊ตํ โ
- ๋ค์ํ ์ธ์ด ์ง์
- gRPC๋ ์ฌ๋ฌ ์ธ์ด(C++, Python, Go, Java, Node.js ๋ฑ)๋ฅผ ์ง์
- ๋ณต์กํ API ์ค๊ณ
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ํน์ ๋ฉ์๋๋ง ํธ์ถํ๋๋ก ์ค๊ณ๋ API๊ฐ ํ์ํ ๊ฒฝ์ฐ
๐ gRPC์ ์ฃผ์ ํต์ ๋ฐฉ์
์ด 4๊ฐ์ง ํต์ ๋ฐฉ์์ ์ง์ํ๋ค.
- Unary RPC (๊ธฐ๋ณธ ์์ฒญ-์๋ต)
- ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ(Request)์ ๋ณด๋ด๋ฉด ์๋ฒ๊ฐ ์๋ต(Response)์ ๋ฐํ
- REST API์ ์ ์ฌ
- ex) ํน์ ๋ฆฌ์์ค์ ์ํ๋ฅผ ์กฐํํ๊ฑฐ๋ ๊ฐ๋จํ ์์ฒญ-์๋ต ์์
- Server Streaming RPC
- ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ณด๋ด๋ฉด ์๋ฒ๊ฐ ์๋ต ์คํธ๋ฆผ์ ์ฌ๋ฌ ๋ฒ ๋ณด๋
- ex) ์ค์๊ฐ ์๋ฆผ, ์ฃผ์ ๊ฐ๊ฒฉ ์ ๋ฐ์ดํธ, ๋น๋์ค ์คํธ๋ฆฌ๋ฐ โ
- Client Streaming RPC
- ํด๋ผ์ด์ธํธ๊ฐ ์คํธ๋ฆผ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ณด๋ด๊ณ , ์๋ฒ๊ฐ ์ด๋ฅผ ์ฒ๋ฆฌํ ํ ๋จ์ผ ์๋ต ๋ฐํ
- ex) IoT ๋๋ฐ์ด์ค์์ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ก๋ํ๊ฑฐ๋ ๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- Bidirectional Streaming RPC
- ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์๋ก ์คํธ๋ฆผ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์
- ex) ์ค์๊ฐ ์ฑํ ์ ํ๋ฆฌ์ผ์ด์ , ๊ฒ์ ์๋ฒ-ํด๋ผ์ด์ธํธ ๋๊ธฐํ
๐ gRPC์ ๋จ์
- ๋ณต์กํ ์ค์
- REST API์ ๋นํด ์ด๊ธฐ ์ค์ ๊ณผ ํ์ต ๊ณก์ ์ด ๋์
- Protobuf ์ ์ ๋ฐ ์ปดํ์ผ ํ์
- ๋ธ๋ผ์ฐ์ ํด๋ผ์ด์ธํธ ์ง์ ์ ํ
- gRPC๋ HTTP/2๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋ธ๋ผ์ฐ์ ์์ ์ง์ ์ฌ์ฉ์ด ์ ํ์
- ๋์ gRPC-Web์ ํตํด ๋ธ๋ผ์ฐ์ ์์ gRPC ํธ์ถ ๊ฐ๋ฅ
- ๋๋ฒ๊น
์ด๋ ค์
- ์ด์ง ์ง๋ ฌํ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก JSON ๊ธฐ๋ฐ REST API์ฒ๋ผ ์ฝ๊ฒ ๋๋ฒ๊น ํ๊ธฐ ์ด๋ ค์
โถ๏ธ ์ถ๊ฐ๋ก ๊ณต๋ถํ ๊ฐ๋
- Protobuf
- Protocol Buffers(Protobuf)๋ Google์ด ๊ฐ๋ฐํ ํจ์จ์ ์ด๊ณ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ ์ง๋ ฌํ ํฌ๋งท
- ํน์ง
- ์ด์ง(binary) ํ์ ์ฌ์ฉ : JSON์ด๋ XML์ฒ๋ผ ์ฌ๋์ด ์ฝ์ ์ ์๋ ํ ์คํธ ํ์์ด ์๋๋ผ, ์ปดํจํฐ๊ฐ ํด์ํ๊ธฐ ์ฌ์ด ์ด์ง ๋ฐ์ดํฐ ํ์์ผ๋ก ๋ณํ โ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฐ์ดํฐ ํฌ๊ธฐ ์ถ์ ๋ฐ ๋น ๋ฅธ ์ฒ๋ฆฌ ์๋ ์ ๊ณต
- ์คํค๋ง ๊ธฐ๋ฐ : ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ง๋ ฌํํ ์ง ๋ฏธ๋ฆฌ ์ ์(Protobuf schema)ํด์ผ ํจ, ์ด ์คํค๋ง๋ฅผ ๋ฐํ์ผ๋ก ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์๋์ผ๋ก ์์ฑ
- HTTP/2
- ๊ธฐ๋ณธ HTTP/1.1์ ๋จ์ ์ ๋ณด์ํ ์๋ก์ด ํ๋กํ ์ฝ, ์น ์ฑ๋ฅ ๊ฐ์ ์ ์ค์ ์ ๋ ๊ธฐ๋ฅ ์ ๊ณต
- HTTP/2๋ ๋ฉํฐํ๋ ์ฑ๊ณผ ํค๋ ์์ถ๊ณผ ๊ฐ์ ์ต์ ํ ๊ธฐ๋ฒ์ ๋์ ํ์ฌ ์์ฒญ ๋ฐ ์๋ต์ ํจ์จ์ฑ์ ๋์๋ค
- ๋ฉํฐํ๋ ์ฑ (Multiplexing)
- ํ๋์ TCP ์ฐ๊ฒฐ์์ ์ฌ๋ฌ ์์ฒญ/์๋ต์ ๋์์ ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ
- HTTP/1.1 ๋ฐฉ์ : ํ๋์ ์์ฒญ-์๋ต์ด ๋๋์ผ ๋ค์ ์์ฒญ-์๋ต์ ์ฒ๋ฆฌ ๊ฐ๋ฅ โ ์์ฒญ ๊ฐ ์์ ์์กด์ฑ์ด ๋ฐ์
- Request 1 -> Response 1
- Request 2 -> Response 2 (Request 1 ์ข ๋ฃ ํ)
- HTTP/2 ๋ฐฉ์ : ์คํธ๋ฆผ(Stream)์ด๋ผ๋ ๊ฐ๋
์ ๋์
ํ์ฌ ํ๋์ ์ฐ๊ฒฐ์์ ์ฌ๋ฌ ์์ฒญ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ โ ์์์ ๋ฌด๊ดํ๊ฒ ์์ฒญ๊ณผ ์๋ต์ด ๋
๋ฆฝ์ ์ผ๋ก ์ด๋ฃจ์ด์ง
-
- Request 2 -> Response 2
- Request 3 -> Response 3 (๋ณ๋ ฌ ์ฒ๋ฆฌ)
-
- ํ๋์ ์ฐ๊ฒฐ์์ ๋์์ ๋ค์์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ฏ๋ก, ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ์ด ๊ฐ์
- ์๋ก์ด TCP ์ฐ๊ฒฐ์ ์ด ํ์๊ฐ ์์ด TCP ํธ๋์์ดํฌ ์๊ฐ ์ ์ฝ
- ํค๋ ์์ถ (Header Compression)
- ์์ฒญ ๋ฐ ์๋ต์์ ๋ฐ๋ณต๋๋ ํค๋ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์์ถํ์ฌ ์ ์กํ๋ ๊ธฐ๋ฅ
- HTTP/1.1 ๋ฐฉ์ : ๋งค ์์ฒญ๋ง๋ค ๋ชจ๋ ํค๋๋ฅผ ์์ ํ ์ ์ก โ ํค๋๊ฐ ํฌ๊ฑฐ๋ ์ค๋ณต ๋ฐ์ดํฐ๊ฐ ๋ง์ผ๋ฉด ๋์ญํญ์ด ๋ญ๋น
- Request 1:
- GET /index.html HTTP/1.1
- Host: example.com
- Cookie: session_id=abc123
- Request 2:
- GET /style.css HTTP/1.1
- Host: example.com
- Cookie: session_id=abc123
- Request 1:
- HTTP/2 ๋ฐฉ์ : HPACK์ด๋ผ๋ ์์ถ ๋ฐฉ์์ ์ฌ์ฉํด ํค๋๋ฅผ ์์ถ โ ์ค๋ณต ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๊ณ , Header Field Table ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ฌ ํ์์ ์ฐธ์กฐ
- Request 1:
- Compressed Headers
- Request 2:
- Reuse Headers (์ฐธ์กฐ๋ง ์ ๋ฌ)
- Request 1:
- ํค๋ ํฌ๊ธฐ๋ฅผ ์ค์ฌ ๋์ญํญ ์ฌ์ฉ๋ ๊ฐ์
- ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ ์ค์ด๋ฆ
โจ gRPC ๋ฅผ ๊ฐ๋จํ๊ฒ ๊ตฌํํด๋ณด์๋ค
[python] gRPC ๊ฐ๋จํ๊ฒ ๊ตฌํํด๋ณด๊ธฐ
๋คํธ์ํฌ ํต์ ํ๋กํ ์ฝ gRPC์ websocket์ ๋น๊ตํด๋ณด์๋ค [gRPC] gRPC๊ณผ websocket ๋น๊ต ์ ๋ฆฌ๊ธฐ์กด์ ๊ฐ๋ฐํ๋ ์๋น์ค์์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ํต์ ์ websocket ์ผ๋ก ๊ตฌํํ๋ค.๋ค ๋๋ด๊ณ ๋์ ํด๋ผ์ด์ธํธ,
bonory.tistory.com
'๐ฉ๐ปโ๐ป > network' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Celery] ์ ์ ํ concurrency ๊ฐ ์ค์ ํ๊ธฐ (0) | 2025.02.19 |
---|---|
[Proxy] ๋ฆฌ๋ฒ์ค ํ๋ก์ Reverse Proxy ์ ๋ฆฌ (0) | 2025.01.24 |
ํน์ port์ ์๋น์ค์๋ง HTTPS 443 SSL ์ ์ฉํ๊ธฐ (0) | 2025.01.22 |
RPC vs gRPC (0) | 2025.01.14 |
์ธํฐ๋ท ์๋ 2๊ฐ์ PC ํต์ ํ๋ ๋ฐฉ๋ฒ (1) | 2024.11.28 |