๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๐ŸŒฎ ๐Ÿ’ฌ
๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป/network

[gRPC] gRPC๊ณผ websocket ๋น„๊ต ์ •๋ฆฌ

by ๋ฐ”์ฟ„๋ฆฌ 2024. 11. 25.

 

๊ธฐ์กด์— ๊ฐœ๋ฐœํ–ˆ๋˜ ์„œ๋น„์Šค์—์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ํ†ต์‹ ์„ websocket ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

๋‹ค ๋๋‚ด๊ณ ๋‚˜์„œ ํด๋ผ์ด์–ธํŠธ, ์„œ๋ฒ„ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ข€ ๋” ์„œ์น˜ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค

๊ทธ๋ ‡๊ฒŒ ์•Œ๊ฒŒ๋œ gRPC. ์ •๋ฆฌํ•ด๋ณด์ž

 

โœ… gRPC์™€ WebSocket

gRPC์™€ WebSocket์€ ๋‘˜ ๋‹ค ๋„คํŠธ์›Œํฌ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ๋กœ, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก๊ณผ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ

  • gRPC
    • Google์ด ๊ฐœ๋ฐœํ•œ RPC(Remote Procedure Call) ํ”„๋ ˆ์ž„์›Œํฌ
    • HTTP/2 ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ(Protocol Buffers, Protobuf)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™”๋ฅผ ์ˆ˜ํ–‰
    • ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋“ฏ์ด ์›๊ฒฉ์œผ๋กœ ๊ธฐ๋Šฅ์„ ์‹คํ–‰
  • WebSocket
    • HTML5 ํ‘œ์ค€์œผ๋กœ, TCP ์†Œ์ผ“ ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ
    • ํ”„๋กœํ† ์ฝœ์€ HTTP์—์„œ ์—…๊ทธ๋ ˆ์ด๋“œ ํ›„ ์ง€์†์ ์ธ ํ’€ ๋“€ํ”Œ๋ ‰์Šค ์—ฐ๊ฒฐ์„ ์ œ๊ณต

gRPC

๐Ÿ˜€ gRPC๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ

  1. ๊ณ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
    1. ๋‚ฎ์€ ๋Œ€์—ญํญ ์‚ฌ์šฉ : *Protobuf๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์ง„(binary) ํ˜•์‹์œผ๋กœ ์ง๋ ฌํ™”ํ•˜๋ฏ€๋กœ JSON์ด๋‚˜ XML๋ณด๋‹ค ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ์ž‘๋‹ค.
    2. ๋‚ฎ์€ ์ง€์—ฐ ์‹œ๊ฐ„ : *HTTP/2์˜ ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ๊ณผ ํ—ค๋” ์••์ถ• ๋•๋ถ„์— ์ง€์—ฐ ์‹œ๊ฐ„์ด ์ ๋‹ค.
  2. ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ 
    1. ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์—์„œ ๊ฐœ๋ณ„ ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์ด ๋นˆ๋ฒˆํ•œ ๊ฒฝ์šฐ
  3. ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ
    1. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตํ™˜ โœ…
  4. ๋‹ค์–‘ํ•œ ์–ธ์–ด ์ง€์›
    1. gRPC๋Š” ์—ฌ๋Ÿฌ ์–ธ์–ด(C++, Python, Go, Java, Node.js ๋“ฑ)๋ฅผ ์ง€์›
  5. ๋ณต์žกํ•œ API ์„ค๊ณ„
    1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์˜ ํŠน์ • ๋ฉ”์„œ๋“œ๋งŒ ํ˜ธ์ถœํ•˜๋„๋ก ์„ค๊ณ„๋œ API๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ

 

๐Ÿ˜€ gRPC์˜ ์ฃผ์š” ํ†ต์‹  ๋ฐฉ์‹

์ด 4๊ฐ€์ง€ ํ†ต์‹  ๋ฐฉ์‹์„ ์ง€์›ํ•œ๋‹ค.

  • Unary RPC (๊ธฐ๋ณธ ์š”์ฒญ-์‘๋‹ต)
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ(Request)์„ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต(Response)์„ ๋ฐ˜ํ™˜
    • REST API์™€ ์œ ์‚ฌ
    • ex) ํŠน์ • ๋ฆฌ์†Œ์Šค์˜ ์ƒํƒœ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ๊ฐ„๋‹จํ•œ ์š”์ฒญ-์‘๋‹ต ์ž‘์—…
  • Server Streaming RPC
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต ์ŠคํŠธ๋ฆผ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณด๋ƒ„
    • ex) ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ, ์ฃผ์‹ ๊ฐ€๊ฒฉ ์—…๋ฐ์ดํŠธ, ๋น„๋””์˜ค ์ŠคํŠธ๋ฆฌ๋ฐ โœ…
  • Client Streaming RPC
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ŠคํŠธ๋ฆผ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•œ ํ›„ ๋‹จ์ผ ์‘๋‹ต ๋ฐ˜ํ™˜
    • ex) IoT ๋””๋ฐ”์ด์Šค์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
  • Bidirectional Streaming RPC
    • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์„œ๋กœ ์ŠคํŠธ๋ฆผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์Œ
    • ex) ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๊ฒŒ์ž„ ์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๋™๊ธฐํ™”

๐Ÿ˜€ gRPC์˜ ๋‹จ์ 

  1. ๋ณต์žกํ•œ ์„ค์ •
    1. REST API์— ๋น„ํ•ด ์ดˆ๊ธฐ ์„ค์ •๊ณผ ํ•™์Šต ๊ณก์„ ์ด ๋†’์Œ
    2. Protobuf ์ •์˜ ๋ฐ ์ปดํŒŒ์ผ ํ•„์š”
  2. ๋ธŒ๋ผ์šฐ์ € ํด๋ผ์ด์–ธํŠธ ์ง€์› ์ œํ•œ
    1. gRPC๋Š” HTTP/2๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ์‚ฌ์šฉ์ด ์ œํ•œ์ 
    2. ๋Œ€์‹  gRPC-Web์„ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €์—์„œ gRPC ํ˜ธ์ถœ ๊ฐ€๋Šฅ
  3. ๋””๋ฒ„๊น… ์–ด๋ ค์›€
    1. ์ด์ง„ ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ 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 1 -> Response 1
        • 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
      • HTTP/2 ๋ฐฉ์‹ : HPACK์ด๋ผ๋Š” ์••์ถ• ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ํ—ค๋”๋ฅผ ์••์ถ• โ†’ ์ค‘๋ณต ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , Header Field Table ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์—ฌ ํ•„์š”์‹œ ์ฐธ์กฐ
        • Request 1:
          • Compressed Headers
        • Request 2:
          • Reuse Headers (์ฐธ์กฐ๋งŒ ์ „๋‹ฌ)
      • ํ—ค๋” ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ ๋Œ€์—ญํญ ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ์†Œ
      • ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ์‹œ๊ฐ„ ์ค„์–ด๋“ฆ

 

โœจ gRPC ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค

 

[python] gRPC ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

๋„คํŠธ์›Œํฌ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ gRPC์™€ websocket์„ ๋น„๊ตํ•ด๋ณด์•˜๋‹ค [gRPC] gRPC๊ณผ websocket ๋น„๊ต ์ •๋ฆฌ๊ธฐ์กด์— ๊ฐœ๋ฐœํ–ˆ๋˜ ์„œ๋น„์Šค์—์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ํ†ต์‹ ์„ websocket ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.๋‹ค ๋๋‚ด๊ณ ๋‚˜์„œ ํด๋ผ์ด์–ธํŠธ,

bonory.tistory.com