ํฌ์ŠคํŠธ

RPC - gRPC์— ๋Œ€ํ•˜์—ฌ

๐Ÿšฉ RPC - gRPC์— ๊ด€ํ•˜์—ฌ

ํ˜„์žฌ ์œ ํ–‰ํ•˜๋Š” MSA ( Micro Service Architecture ) ๊ตฌ์กฐ๋กœ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๋‹ค๋ณด๋ฉด, ๋‹ค์–‘ํ•œ ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๊ฐœ๋ฐœ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋นˆ๋ฒˆํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Service ๊ฐ„์— ํ†ต์‹ ์ด ํ™˜๊ฒฝ์˜ ์˜ํ–ฅ์„ ๋ฐ›์•„ ๋งค์šฐ ๋ณต์žกํ•ด์ง€๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„์— API ( Application Programming Interface ) ๋ฅผ ๋งŒ๋“ ๋‹ค. ํ˜„์žฌ ์ œ์ผ ๋Œ€์ค‘์ ์ธ API ๋Š” HTTP Protocol ์„ ํ™œ์šฉํ•œ RestAPI ์ธ๋ฐ, ์šฐ์—ฐํžˆ RPC ์— ๋Œ€ํ•ด์„œ ์•Œ๊ฒŒ๋˜์–ด ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๐Ÿ“ RPC ( Remote Procedure Call ) ๋ž€ ?

โ–  RPC ( Remote Procedure Call ) ์˜ ์ •์˜

  • Remote Procedure Call( ์›๊ฒฉ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ )์˜ ์•ฝ์ž๋กœ, ๋ณ„๋„์˜ ์›๊ฒฉ ์ œ์–ด๋ฅผ ์œ„ํ•œ ์ฝ”๋”ฉ ์—†์ด ๋‹ค๋ฅธ ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ ํ•จ์ˆ˜ ( Function ) ํ˜น์€ ํ”„๋กœ์‹œ์ € ( Procedure ) ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹  ๊ธฐ์ˆ 

์šฉ์–ด ์ •๋ฆฌ

  • ํ•จ์ˆ˜ ( Function ) : Input ์— ๋”ฐ๋ฅธ Output ์˜ ๋ฐœ์ƒ์ด ๋ชฉ์ ์ด๋ฏ€๋กœ Return ๊ฐ’์„ ํ•„์ˆ˜๋กœ ๊ฐ€์ง€๋Š” ๊ณ„์‚ฐ
  • ํ”„๋กœ์‹œ์ € ( Procedure ) : Input ์— ๋”ฐ๋ฅธ Output ์˜ ๋ฐœ์ƒ์— ์ง‘์ค‘ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ž‘์—…์— ์ง‘์ค‘ํ•œ ๊ฐœ๋…

โ–  RPC ( Remote Procedure Call ) ์˜ ๋™์ž‘ ์›๋ฆฌ

๋™์ž‘ ์ˆœ์„œ

  1. Client ์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ Client stub ์— ์ „๋‹ฌ
  2. Client stub ์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฉ”์‹œ์ง€๋กœ Marshalling
  3. Client stub ์€ Marshalling ๋œ ๋ฉ”์„ธ์ง€๋ฅผ ์ „์†ก๊ณ„์ธต ( Transport Layer ) ์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ Server ๋กœ ์ „์†ก.
  4. Server ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•„ Server stub ์œผ๋กœ ์ „๋‹ฌํ•˜๊ณ  ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ UnMarshalling ํ•˜์—ฌ Server ํ•จ์ˆ˜ ํ˜ธ์ถœ
  5. ํ•จ์ˆ˜ ์ˆ˜ํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด Server Stub ์œผ๋กœ ๋ฆฌํ„ด๋˜๋ฉฐ ๋ฆฌํ„ด๊ฐ’์„ ๋ฉ”์‹œ์ง€๋กœ Marshalling
  6. ๊ฒฐ๊ณผ ๋ฉ”์‹œ์ง€๋ฅผ Client ์— ๋ณด๋‚ด๊ณ  Client ๋Š” UnMarshalling ํ›„, ๋ฆฌํ„ด๊ฐ’์„ Client ์—๊ฒŒ ๋ฐ˜ํ™˜

์šฉ์–ด ์ •๋ฆฌ

  • Stub : ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ์‚ฌ์šฉ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ Marshalling, UnMarshalling ํ•˜๋Š” ์—ญํ• 
    • Client stub : ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ์‚ฌ์šฉ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๋ณ€ํ™˜(Marshalling) ๋ฐ ํ•จ์ˆ˜ ์‹คํ–‰ ํ›„ Server ์—์„œ ์ „๋‹ฌ๋œ ๊ฒฐ๊ณผ์˜ ๋ฐ˜ํ™˜
    • Server stub : Client ๊ฐ€ ์ „๋‹ฌํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์—ญ๋ณ€ํ™˜(UnMarshalling) ๋ฐ ํ•จ์ˆ˜ ์‹คํ–‰ ๊ฒฐ๊ณผ ๋ณ€ํ™˜ํ•˜์—ฌ Client ์— ๋ฐ˜ํ™˜
  • Marshalling & UnMarshalling : ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ณ€ํ™˜ํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •
  • Serialize & Deserialize : ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด byte stream ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •

โ–  RPC ( Remote Procedure Call ) ์˜ ์ตœ์ข… ์ง€ํ–ฅ์ 

  • Client <-> Server ๊ฐ„์˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์— ํ•„์š”ํ•œ ์ƒ์„ธ์ •๋ณด๋Š” ์ตœ๋Œ€ํ•œ ๊ฐ์ถ˜๋‹ค.
  • Client ๋Š” ์ผ๋ฐ˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ Server ์˜ Method ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Server ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ผ๋ฐ˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ Client Method ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

โ–  RPC ( Remote Procedure Call ) ์˜ ์žฅ์ 

  1. ํ™˜๊ฒฝ์— ์ œํ•œ ๋ฐ›์ง€ ์•Š๊ณ  ํ”„๋กœ๊ทธ๋žจ ๊ฐ„ ํ†ต์‹ ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ  ์ •๊ตํ•œ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  2. ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•œ ์ œํ•œ ์—†์ด ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ ์ง‘์ค‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

โ–  RPC ( Remote Procedure Call ) ์˜ ๋‹จ์ 

  1. ํ˜ธ์ถœ ์‹คํ–‰๊ณผ ๋ฐ˜ํ™˜ ์‹œ๊ฐ„์ด ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.
    • ๋„คํŠธ์›Œํฌ ๊ตฌ๊ฐ„์„ ํ†ตํ•˜์—ฌ RPC ํ†ต์‹ ์„ ํ•˜๋Š” ๊ฒฝ์šฐ, ๋„คํŠธ์›Œํฌ๊ฐ€ ๋Š๊ฒผ์„ ๋•Œ ์น˜๋ช…์  ๋ฌธ์ œ ๋ฐœ์ƒํ•œ๋‹ค.
  2. ํ†ต์‹ ๊ฐ„์˜ ๋ณด์•ˆ์ด ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ“ gRPC ( Google Remote Procedure Call ) ๋ž€ ?

โ–  gRPC ( Google Remote Procedure Call ) ์˜ ์ •์˜

  • HTTP/2 ์™€ ProtocolBuf ๋ฅผ ํ™œ์šฉํ•˜์—ฌ Google ์—์„œ ๊ฐœ๋ฐœํ•œ ์˜คํ”ˆ์†Œ์Šค RPC Framework

โ—‹ gRPC ( Google Remote Procedure Call ) ๋™์ž‘ ์›๋ฆฌ

โ–  gRPC ( Google Remote Procedure Call ) ์˜ ํŠน์ง•

  1. HTTP/2 ๋ฅผ ํ™œ์šฉํ•œ ๋›ฐ์–ด๋‚œ ํšจ์œจ์„ฑ
  2. ProtoBuf(proto3) ๋ฅผ ์ด์šฉํ•œ JSON ์ƒ์œ„์˜ ์„ฑ๋Šฅ
  3. RPC ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•œ ์ธ์ฆ, ์•”ํ˜ธํ™”, ์••์ถ• ๋“ฑ ํ’๋ถ€ํ•œ ๋‚ด์žฅ ๊ธฐ๋Šฅ
  4. Java, C++, C#, Python, Ruby, Node.js ๋“ฑ 10๊ฐœ์˜ ์–ธ์–ด ์ง€์›

โ—‹ HTTP/2 ๋ž€?

  • HTTP 1.1 ์˜ ๊ฐœ์„ ๋œ ๋ฒ„์ „์œผ๋กœ SPDY ( ์Šคํ”ผ๋”” ) ๊ธฐ๋ฐ˜ HTTP ํ”„๋กœํ† ์ฝœ์˜ ๋‘๋ฒˆ์žฌ ๋ฒ„์ „
  • SPDY ( ์Šคํ”ผ๋”” )

    ์ „์†ก ์ง€์—ฐ ( latency ) ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์„ ์ง‘์ค‘ํ•˜์—ฌ HTTP ํ†ต์‹ ์„ ๊ณ ์†ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ๊ธ€์ด ๊ฐœ๋ฐœํ•œ ๋น„ํ‘œ์ค€ ๊ฐœ๋ฐฉํ˜• ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ

โ—‹ HTTP/2 ํŠน์ง•

  • HTTP/1.1 ์˜ ์ˆœ์ฐจ์  ์ฒ˜๋ฆฌ์™€๋Š” ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ TCP/IP ์—ฐ๊ฒฐ์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ŠคํŠธ๋ฆผ์„ ๋™์‹œ์— ์—ด์–ด ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ
  • ๊ธฐ์กด Client ์™€ Server ์—์„œ ์‚ฌ์šฉ๋œ Header ๋“ค์˜ ๋ชฉ๋ก๋“ค์„ ๊ด€๋ฆฌํ•˜์—ฌ ์ค‘๋ณต ํ—ค๋” ํ”„๋ ˆ์ž„์„ ์••์ถ•ํ•ด์„œ ์ „์†ก
  • HTTP/1.1 Text ๊ธฐ๋ฐ˜ protocol ์—์„œ Binary protocol ์ง€์›

โ—‹ ProtoBuf ( Protocol Buffer ) ๋ž€?

  • gRPC ์—์„œ ์‚ฌ์šฉ๋˜๋Š” XML, JSON ๊ณผ ์œ ์‚ฌํ•œ ์ง๋ ฌํ™” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ

โ—‹ ProtoBuf ( Protocol Buffer ) ํŠน์ง•

  1. byte ๋ฅผ ์ „์†กํ•˜๊ธฐ ๋•Œ๋ฌธ์— JSON ๊ณผ ๊ฐ™์€ Parsing ( ํŒŒ์‹ฑ ) ์˜ ๋ถˆํ•„์š”
  2. ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ผ๋„ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์•„ ๋น ๋ฅธ ํ†ต์‹  ์†๋„
  3. binary ๊ตฌ์กฐ๋กœ ์ธํ•œ ์ธ๊ฐ„์ด ์ฝ๊ธฐ ์–ด๋ ค์šด ๊ตฌ์กฐ
  4. proto ๋ฌธ๋ฒ•์— ๋Œ€ํ•œ Learning Curve

โ–  gRPC ( Google Remote Procedure Call ) ์˜ ์žฅ์ 

  1. ProtoBuf ๊ธฐ๋ฐ˜ Binary Protocol ์‚ฌ์šฉ
  2. HTTP/2 ์‚ฌ์šฉ

โ€ป ์šฐ์ˆ˜ํ•œ ๋„คํŠธ์›Œํฌ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ

โ–  gRPC ( Google Remote Procedure Call ) ์˜ ๋‹จ์ 

  1. Browser ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€
  2. Binary Protocol ๋กœ ์ธํ•œ Debug ์— ์–ด๋ ค์›€ ( Not Human Readable )
  3. ๊ธฐ์กด์˜ RPC ๋ณด๋‹ค๋Š” ๊ฐ„ํŽธํ•˜๋‚˜ ์—ฌ์ „ํ•œ Learning Curve
  4. Load Balancer ( ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ) ๊ฐ€ HTTP/2 ๋ฅผ ์ง€์›ํ•ด์•ผํ•œ๋‹ค.

โ€ป Rest ์— ๋น„ํ•ด Learning Curve ๊ฐ€ ๋†’๋‹ค.

๐Ÿšฉ ๋งˆ์น˜๋ฉฐ..

gRPC ์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค. Rest ์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์‹คํžˆ Learning Curve ๊ฐ€ ๋ฌด์ง€๋ง‰์ง€ํ•˜๊ฒŒ ๋†’๋‹ค. ์ „๋ฌธ๊ฐ€๊ฐ€ ๋œ๋‹ค๋ฉด ์ง€๊ธˆ์˜ ์ƒ์šฉ์„œ๋น„์Šค๋ฅผ ํ™œ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์ด ๊ธฐ์ˆ ๋งŒ์œผ๋กœ๋„ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.