gRPC
gRPC๋?
google์์ ๊ฐ๋ฐํ RPC(Remote Procedure Call)๋ก ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ํต์ ์ ๊ฐํธํ๊ณ ํจ์จ์ ์ผ๋ก ํ ์ ์๋๋ก ์ค๊ณ๋ ํ๋กํ ์ฝ์ด๋ค.
์ฆ, ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ๋ฉ์์ง๋ฅผ ๋น ๋ฅด๊ณ ์ ๋ขฐ์ฑ ์๊ฒ ๊ตํํ ์ ์๋๋ก ๋์์ค๋ค.
ํ๋กํ ์ฝ ๋ฒํผ (Protocol Buffers, Protobuf)
gRPC๋ Protobuf๋ผ๋ ์ง๋ ฌํ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ค.
Protobuf๋ ๋ฐ์ดํฐ๋ฅผ ์ด์ง ํ์์ผ๋ก ์ง๋ ฌํํ๊ณ ์ญ์ง๋ ฌํํ๋ ๋ฐฉ์์ผ๋ก, JSON์ด๋ XML๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ค.
ํนํ ์์ ๋ฉ์์ง ํฌ๊ธฐ์ ๊ฒฝ์ฐ, ์ง๋ ฌํ/์ญ์ง๋ ฌํ ๊ณผ์ ์์ ๋งค์ฐ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ์ ์ก์ ์ ๊ณต์ด ๊ฐ๋ฅํ๋ค. ์ด ๋ฐฉ์์ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ ์ต์ํํ๊ณ , ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํ ์๊ฐ์ ํฌ๊ฒ ์ค์ฌ ๋คํธ์ํฌ ๋์ญํญ์ ์ ์ฝํ๊ณ ์ฑ๋ฅ์ ๊ฐ์ ์ด ๊ฐ๋ฅํ๋ค.
RESTful API๋ ์ผ๋ฐ์ ์ผ๋ก JSON์ ์ฌ์ฉํ์ง๋ง, gRPC๋ Protobuf๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ ์ก์ ๋ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด, ํนํ ๋์ฉ๋ ๋ฐ์ดํฐ ์ ์ก ์ gRPC๊ฐ ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ์ ์ก ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค.
http/2
gRPC๋ HTTP/2๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ํฉ๋๋ค.
HTTP/1.1์์๋ ํ ์ฐ๊ฒฐ์์ ๋์์ ์ฌ๋ฌ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์๊ธฐ ๋๋ฌธ์ ํค๋ ์ค๋ธ ๋ผ์ธ ๋ธ๋กํน(Head-of-line Blocking) ํ์์ด ๋ฐ์ํ์ฌ ์ฑ๋ฅ์ด ์ ํ๋์๋๋ฐ
๋ฐ๋ฉด, HTTP/2๋ ๋ฉํฐํ๋ ์ฑ ๋ฐฉ์์ ์ง์ํ์ฌ ํ๋์ ์ฐ๊ฒฐ๋ก ์ฌ๋ฌ ์์ฒญ์ ๋ณ๋ ฌ์ ์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค. ์ด๋ฅผ ํตํด ์์ฒญ์ ์๋ต ์๊ฐ์ ๋จ์ถ์ํค๊ณ ๋คํธ์ํฌ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
HTTP/1.1์์๋ ์์ฒญ๋ง๋ค ์๋ก์ด ์ฐ๊ฒฐ์ ์์ฑํ๊ฑฐ๋ ์์ฒญ ์์๋๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด์๊ธฐ ๋๋ฌธ์, ํนํ ๋๋์ ์์ฒญ์ ์ฒ๋ฆฌํ ๋ ๋ณ๋ชฉ ํ์์ด ๋ฐ์ํ ์ ์์์ต๋๋ค. ๋ฐ๋ฉด, HTTP/2๋ ํ๋์ ์ฐ๊ฒฐ์ ํตํด ์ฌ๋ฌ ์์ฒญ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ ์ ์์ด, ์ฑ๋ฅ์ด ํฌ๊ฒ ๊ฐ์ ๋ฉ๋๋ค.
์๋ฐฉํฅ ์คํธ๋ฆฌ๋ฐ
gRPC๋ ์๋ฐฉํฅ ์คํธ๋ฆฌ๋ฐ์ ์ง์ํ๋ค. (TCP๋ฐฉ์)
ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ ์ฐ๊ฒฐ์ ์ ์งํ๋ฉด์ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด, ์ค์๊ฐ ํต์ ์ด ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋์ฉ๋ ์ฑํ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋, ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ ์กํ ์ ์๋ค.
- ์๋ฐฉํฅ ์คํธ๋ฆฌ๋ฐ์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ธ ํ, ์๋ฒ๊ฐ ์ค์๊ฐ์ผ๋ก ์๋ต์ ๋ฐํํ๋ฉด์ ๋์์ ํด๋ผ์ด์ธํธ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ๋ฐฉ์ ์ด๋ฅผ ํตํด ์ค์๊ฐ ์ํธ์์ฉ์ ์ํํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
ํฌ๋ก์ค ํ๋ซํผ
gRPC๋ ๋ค์ํ ์ธ์ด๋ฅผ ์ง์ํ๋ฏ๋ก, ์๋ก ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ ์๋ฒ๋ค ๊ฐ์๋ ์๋ฒ ๊ฐ ํต์ ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
gRPC vs ๋คํธ์ํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (Boost.Asio, kqueue ๋ฑ)
1. gRPC์ ์ฅ์
- ๊ณ ์ ํต์ : Protobuf๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํํ๊ณ ์ญ์ง๋ ฌํํ ๋, JSON๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ณ ์์ ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ ์๋ค.
- HTTP/2 ์ง์: gRPC๋ HTTP/2๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ์ฌ ๋ฉํฐํ๋ ์ฑ, ํค๋ ์์ถ ๋ฑ์ ํตํด ์ฑ๋ฅ์ ์ต์ ํํ์ฌ ์ฌ๋ฌ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ ์ ์๋ค.
- ์๋ฐฉํฅ ์คํธ๋ฆฌ๋ฐ: ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋์์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์, ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐ ์ ๋ฆฌํ๋ค.
- ํ๋ซํผ ๋ ๋ฆฝ์ฑ: gRPC๋ ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ง์ํ์ฌ ๋ค์ํ ํ๋ซํผ์์ ํธํ์ด ๊ฐ๋ฅํ๋ค. ์ด๋ฅผ ํตํด ์ฌ๋ฌ ์ธ์ด๋ก ์์ฑ๋ ์์คํ ๊ฐ์ ํต์ ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
2. ๋คํธ์ํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (Boost.Asio, kqueue ๋ฑ)
Boost.Asio์ kqueue ๊ฐ์ ๋คํธ์ํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ์์ค์ ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๋๊ตฌ๋ก, ์ง์ ์์ผ์ ์ด๊ณ ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค
- ์ธ๋ฐํ ์ ์ด: ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ์ง์ ์ ์ดํ๊ณ ์ต์ ํํ ์ ์๊ธฐ ๋๋ฌธ์, ์ฑ๋ฅ ๋ฉด์์ ๋ ์ธ๋ฐํ ์กฐ์ ์ด ๊ฐ๋ฅํ๋ค.
- ๋ฎ์ ๋ ๋ฒจ์ ์์ : ์ฃผ๋ก ์์ผ ํ๋ก๊ทธ๋๋ฐ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ก์์ ํ๋ฉฐ, ๋น๋๊ธฐ์ I/O๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ค.
- ๋ณต์ก์ฑ: ์ง์ ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์, ๋ณต์กํ ์ฝ๋์ ๋๋ฒ๊น ์ด ํ์ํ ์ ์์ต๋๋ค. ๋ํ, ๋ฉํฐํ๋ ์ฑ, ์ฌ์๋ ๋ฉ์ปค๋์ฆ, ๋ฐ์ดํฐ ์ง๋ ฌํ ๋ฑ์ ์๋์ผ๋ก ๊ตฌํํด์ผ ํ๋ฏ๋ก ๊ฐ๋ฐ ๋์ด๋๊ฐ ๋๋ค.
3. ๊ฒฐ๋ก
gRPC : HTTP/2, ์๋ฐฉํฅ ์คํธ๋ฆฌ๋ฐ, ๋์ฉ๋์ ์ค์๊ฐ ํต์
network library : ์ธ๋ฐํ ์ฑ๋ฅ ์ต์ ํ
๋จ์ํ๊ณ ํจ์จ์ ์ธ ๋ํํ ์์คํ ์ ๊ตฌ์ถํ๊ณ ์ ํ ๋๋ gRPC๊ฐ ๋ ์ ํฉํ๊ณ , ์ธ๋ฐํ ์ฑ๋ฅ ์ต์ ํ๊ฐ ํ์ํ๋ค๋ฉด Boost.Asio์ ๊ฐ์ ๋คํธ์ํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํ