CS

gRPC

moaoh 2024. 12. 17. 03:19

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๋ฐฉ์‹)

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด, ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์ด ํ•„์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋Œ€์šฉ๋Ÿ‰ ์ฑ„ํŒ… ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์–‘๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆฌ๋ฐ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„, ์„œ๋ฒ„๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด์„œ ๋™์‹œ์— ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹ ์ด๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์„ ์›ํ™œํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

ํฌ๋กœ์Šค ํ”Œ๋žซํผ

https://grpc.io/docs/what-is-grpc/introduction/

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์™€ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒ