gRPC

GreenBeanΒ·2022λ…„ 2μ›” 9일
0
post-thumbnail

gRPC

πŸ“’ λ°°κ²½ 지식

RPC

  • RPC(Remote Procedure Call, 원격 ν”„λ‘œμ‹œμ € 호좜)λŠ” ν•œ ν”„λ‘œκ·Έλž¨μ΄ λ„€νŠΈμ›Œν¬μ˜ μ„ΈλΆ€ 정보λ₯Ό μ΄ν•΄ν•˜μ§€ μ•Šκ³ λ„ λ„€νŠΈμ›Œν¬ μ•ˆμ˜ λ‹€λ₯Έ 컴퓨터에 μžˆλŠ” ν”„λ‘œκ·Έλž¨μ—μ„œ μ„œλΉ„μŠ€λ₯Ό μš”μ²­ν•˜λŠ” ν”„λ‘œν† μ½œ
    • 원격에 μžˆλŠ” ν•¨μˆ˜λ₯Ό 호좜 ν•΄μ£ΌλŠ” κΈ°λŠ₯
    • 원격에 μœ„μΉ˜ν•œ ν”„λ‘œκ·Έλž¨μ„ λ‘œμ»¬μ— μžˆλŠ” ν”„λ‘œκ·Έλž¨μ²˜λŸΌ μ‚¬μš©ν•  수 있음
    • λΆ„μ‚° λ„€νŠΈμ›Œν¬ μ»΄ν“¨ν„°ν™˜κ²½μ—μ„œ ν”„λ‘œκ·Έλž˜λ°μ„ μ‰½κ²Œ ν•˜κΈ° μœ„ν•΄ λ‚˜μ˜¨ 방식
  • RPCλŠ” Client-Server λͺ¨λΈμ„ μ‚¬μš©
    • ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ„œλΉ„μŠ€λ₯Ό μš”μ²­(Function Call)ν•˜λ©΄, μ„œλ²„μ—μ„œ μ„œλΉ„μŠ€λ₯Ό 제곡

  • λ§€κ°œλ³€μˆ˜λ₯Ό μ•Œμ•„μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— μ–‘μͺ½μ˜ μΈν„°νŽ˜μ΄μŠ€ κ·œμ•½μ„ IDL λ“±μ˜ μ–Έμ–΄λ‘œ μ •μ˜ν•œ ν›„, ν•΄λ‹Ή ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄κ°€ λΆ€λ₯Ό 수 μžˆλŠ” ν˜•νƒœμ˜ μ½”λ“œλ‘œ 생성을 ν•΄μ€˜μ•Ό ν•˜λŠ”λ° 이λ₯Ό Stubκ³Ό Skeleton μ½”λ“œλΌκ³  함
  • HTTP 기반의 RESTκ°€ μœ ν–‰ν•˜λ©΄μ„œ RPCλŠ” 많이 μ‚¬λΌμ‘ŒλŠ”λ°, λ°˜λŒ€λ‘œ REST의 경우 호좜 ν•˜λŠ” λ§€κ°œλ³€μˆ˜μ™€ 응닡 값이 λͺ…μ‹œμ μ΄μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 였λ₯˜μ˜ 여지가 많고 JSON을 HTTPλ₯Ό ν†΅ν•΄μ„œ 쏘기 λ•Œλ¬Έμ— λ‹€μ†Œ 속도가 λ–¨μ–΄μ§„λ‹€λŠ” 단점을 가지고 있음
    • κ·Έλž˜μ„œ κ·Όλž˜μ— RPC κ°œλ…μ΄ λ‹€μ‹œ μœ ν–‰ν•˜κΈ° μ‹œμž‘ν–ˆλŠ”λ°, 페이슀뢁의 κ²½μš°μ—λŠ” ThriftλΌλŠ” λ°”μ΄λ„ˆλ¦¬ 기반의 RPC ν”„λ ˆμž„μ›μ„ λ°œν‘œ
    • ꡬ글은 RPC μžμ²΄λŠ” μ§€μ›ν•˜μ§€ μ•Šκ³ , 메세지(JSON λ“±)을 직렬화 ν•  수 μžˆλŠ” ν”„λ ˆμž„μ›μœΌλ‘œ Protocol Buffersλ₯Ό μ œκ³΅ν•΄μ™”μŒ
      • gRPCλΌλŠ” κ°œλ…μœΌλ‘œ Protocol Buffersλ₯Ό 기본으둜 HTTP/2λ₯Ό λΆ™μ—¬μ„œ RPC ν”„λ ˆμž„μ›μ„ 릴리즈

HTTP ν”„λ‘œν† μ½œ

  • HTTP(Hypertext Transfer Protocol)λŠ” μ›Ήμ—μ„œ μ“°μ΄λŠ” 톡신 ν”„λ‘œν† μ½œ
    • ν”„λ‘œν† μ½œμ΄λž€ μƒν˜Έκ°„μ— μ •μ˜ν•œ κ·œμΉ™μ„ 의미
  • HTTP ν”„λ‘œν† μ½œμ€ TCP/IP ν”„λ‘œν† μ½œ μœ„μ˜ Application layerμ—μ„œ λ™μž‘

  • HTTP ν”„λ‘œν† μ½œμ€ Stateless ν”„λ‘œν† μ½œ
    • μ—¬κΈ°μ„œ μƒνƒœκ°€ μ—†λ‹€λŠ” μ˜λ―ΈλŠ” 데이터λ₯Ό μ£Όκ³  λ°›κΈ° μœ„ν•œ 각각의 데이터 μš”μ²­μ΄ μ„œλ‘œ λ…λ¦½μ μœΌλ‘œ κ΄€λ¦¬λœλ‹€λŠ” 의미
      • 이전 데이터 μš”μ²­κ³Ό λ‹€μŒ 데이터 μš”μ²­μ΄ μ„œλ‘œ 관련이 μ—†λ‹€λŠ” 뜻
  • HTTPλŠ” 기본적으둜 Server-Client ꡬ쑰λ₯Ό 따름
    • 이 κ΅¬μ‘°μ—μ„œ HTTP ν”„λ‘œν† μ½œλ‘œ 데이터λ₯Ό μ£Όκ³ λ°›κΈ° μœ„ν•΄μ„œλŠ” μ•„λž˜μ™€ 같이 μš”μ²­μ„ 보내고 응닡을 λ°›μ•„μ•Ό 함

Tip! HTTP 버전별 차이

IDL

  • μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈκ°€ 정보λ₯Ό μ£Όκ³  λ°›λŠ” κ·œμΉ™μ΄ ν”„λ‘œν† μ½œμ΄λΌλ©΄, IDL(Interface Definition Language, μΈν„°νŽ˜μ΄μŠ€ μ •μ˜ μ–Έμ–΄)은 정보λ₯Ό μ €μž₯ν•˜λŠ” κ·œμΉ™
  • λŒ€ν‘œμ μΈ IDLλ‘œλŠ” XML, JSON, Protocol Buffers 3가지가 쑴재

XML

  • XML(eXtensible Markup Langauge)은 μ–΄λ– ν•œ 데이터λ₯Ό μ„€λͺ…ν•˜κΈ° μœ„ν•΄ 이름을 μž„μ˜λ‘œ 지은 νƒœκ·Έλ‘œ 데이터λ₯Ό 감싸며, νƒœκ·Έλ‘œ μ‚¬μš©μžκ°€ 직접 데이터 ꡬ쑰λ₯Ό μ •μ˜ ν•  수 있음
  • XML은 HTML처럼 데이터λ₯Ό λ³΄μ—¬μ£ΌλŠ” 것이 λͺ©μ μ΄ μ•„λ‹Œ 데이터λ₯Ό μ €μž₯ν•˜κ³  전달할 λͺ©μ μœΌλ‘œ λ§Œλ“€μ–΄μ‘ŒμŒ
  • HTTP + XML μ‘°ν•©μœΌλ‘œ 많이 μ‚¬μš©λ¨

JSON

  • JSON(JavaScript Object Notation)은 Javascript의 λΆ€μƒμœΌλ‘œ 많이 쓰이고 μžˆλŠ” 데이터 ꡬ쑰
  • XML이 가진 읽기 λΆˆνŽΈν•˜κ³  λ³΅μž‘ν•˜κ³  느린 속도 문제λ₯Ό ν•΄κ²°ν–ˆμœΌλ©° νŠΉνžˆλ‚˜ Key-Value둜 μ •μ˜λœ ꡬ쑰 μžμ²΄κ°€ ꡉμž₯히 직관적
  • HTTP + RESTful API + JSON μ‘°ν•©μœΌλ‘œ 많이 μ‚¬μš©λ¨

Protocol Buffers

  • XML의 λ¬Έμ œμ μ„ κ°œμ„ ν•˜κΈ° μœ„ν•΄ μ œμ•ˆλœ IDL이며, XML보닀 μ›”λ“±ν•œ μ„±λŠ₯을 μ§€λ‹˜
  • Protocol BuffersλŠ” ꡬ쑰화(Structured)된 데이터λ₯Ό 직렬화(Serialization)ν•˜κΈ° μœ„ν•œ ν”„λ‘œν† μ½œλ‘œ XML보닀 μž‘κ³  λΉ λ₯΄κ³  간단
    • .proto νŒŒμΌμ— Protocol Buffers 메세지 νƒ€μž…μ„ μ •μ˜
  • Protocol BuffersλŠ” κ΅¬μ‘°ν™”λœ 데이터λ₯Ό μ§λ ¬ν™”ν•˜λŠ”λ° μžˆμ–΄μ„œ XML보닀 λ§Žμ€ μž₯점듀을 가지고 있음
    • 간단함
    • 파일 크기가 3-10λ°° 정도 μž‘μŒ
    • 속도가 20-100λ°° 정도 빠름
    • XML보닀 가독성이 μ’‹κ³  λͺ…μ‹œμ 
  • IDLλ‘œμ„œ 데이터 ꡬ쑰λ₯Ό μ •μ˜ν•œ λ‹€μŒ, .proto νŒŒμΌμ„ Protocol Buffer Compiler(Protoc)λ₯Ό μ΄μš©ν•΄ μ»΄νŒŒμΌν•¨
    • 컴파일된 μ†ŒμŠ€ μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μ–‘ν•œ 데이터 μŠ€νŠΈλ¦Όμ—μ„œ λ‹€μ–‘ν•œ μ–Έμ–΄λ‘œ λ‹€μ–‘ν•œ ꡬ쑰의 데이터λ₯Ό μ‰½κ²Œ 읽고 μ“Έ 수 있음
  • Protocol BuffersλŠ” ν˜„μž¬ Java, Python, Objective-C 및 C++μ—μ„œ μƒμ„±λœ μ½”λ“œλ₯Ό 지원
    • μƒˆλ‘œμš΄ proto3 버전을 μ‚¬μš©ν•˜λ©΄ proto2에 λΉ„ν•΄ 더 λ§Žμ€ μ–Έμ–΄(Dart, Go, Ruby 및 C#)을 μ‚¬μš©ν•  수 있음

Tip! Protocol Buffers

  • μ„œλ²„μ—μ„œλŠ” ν•¨μˆ˜μ˜ 이름, νŒŒλΌλ―Έν„° 그리고 리턴값을 μ •μ˜
  • ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•΄μ„œ μž…λ ₯κ³Ό ν•¨μˆ˜μ˜ 이름을 ν†΅ν•΄μ„œ ν•¨μˆ˜λ₯Ό 호좜
    • 이런 과정이 κ°€λŠ₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ¨Όμ € μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ λͺ¨λ‘ κ³΅ν†΅λœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ°€μ Έμ•Όν•˜λŠ”λ° 이λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•΄μ£ΌλŠ” 것이 IDL(Interface Definition Language)
    • gRPCλŠ” IDL둜 Protocol Buffersλ₯Ό μ΄μš©ν•˜κ³  있음
# Protocol Buffer의 κΈ°λ³Έ ν˜•μ‹

syntax = "proto3";

service HelloService {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
  string greeting = 1;
}

message HelloResponse {
  string reply = 1;
}
  • HelloServiceλΌλŠ” μ„œλΉ„μŠ€μ— SayHello ν•¨μˆ˜κ°€ 있음
    • 그리고 κ·Έ μš”μ²­μ΄ HelloRequest이며 μ‘λ‹΅μœΌλ‘œ HelloResponse의 ν˜•μ‹μ„ κ°€μ§€κ²Œ λœλ‹€λŠ” 의미

πŸ“˜ gPRC

gRPCλž€?

  • gRPC(google Remote Procedure Calls)λŠ” ꡬ글이 졜초둜 κ°œλ°œν•œ μ˜€ν”ˆ μ†ŒμŠ€ RPC μ‹œμŠ€ν…œ
    • RPC(Remote Communication Mechanism, 원격 ν”„λ‘œμ‹œμ € 호좜)의 ν•œ μ’…λ₯˜λ‘œ, RPCλŠ” REST API와 λ‹€λ₯Έ λŠλ‚Œμ„ 가짐
    • 즉, REST APIλŠ” μ„œλ²„μ˜ ν•΄λ‹Ή 경둜둜 ν˜ΈμΆœν•œλ‹€λΌλŠ” λŠλ‚Œμ΄λΌλ©΄ RPCλŠ” μ„œλ²„μ— μžˆλŠ” νŠΉμ • ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€λΌκ³  μƒκ°ν•˜λ©΄ 됨
  • 전솑을 μœ„ν•΄ TCP/IP ν”„λ‘œν† μ½œκ³Ό HTTP/2 ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜κ³  IDL(Interface Definition Language, μΈν„°νŽ˜μ΄μŠ€ μ •μ˜ μ–Έμ–΄)둜 Protocol Buffersλ₯Ό μ‚¬μš©
    • 인증, μ–‘λ°©ν–₯ 슀트리밍 및 흐름 μ œμ–΄, 차단 및 비차단 바인딩, μ·¨μ†Œ 및 νƒ€μž„μ•„μ›ƒ λ“±μ˜ κΈ°λŠ₯을 제곡
    • μˆ˜λ§Žμ€ μ–Έμ–΄λ₯Ό λŒ€μƒμœΌλ‘œ 크둜슀 ν”Œλž«νΌ ν΄λΌμ΄μ–ΈνŠΈ 및 μ„œλ²„ 바인딩을 생성
  • κ°€μž₯ ν”ν•œ μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€μ—λŠ” 마이크둜 μ„œλΉ„μŠ€ μŠ€νƒ€μΌ μ•„ν‚€ν…μ²˜μ˜ μ„œλΉ„μŠ€ μ—°κ²°, λͺ¨λ°”일 μž₯치, λΈŒλΌμš°μ € ν΄λΌμ΄μ–ΈνŠΈλ₯Ό λ°±μ—”λ“œ μ„œλΉ„μŠ€μ— μ—°κ²°ν•˜λŠ” 일 등이 포함
  • gRPCλŠ” HTTP/2을 기반으둜 Protocol Buffers둜 μ •μ˜ν•˜λ©° 톡신 μ‹œ λ°”μ΄νŠΈ 슀트림으둜 톡신
    • λ”°λΌμ„œ JSON 기반으둜 ν†΅μ‹ ν•˜λŠ” Rest API 보닀 더 가벼움
  • λ˜ν•œ gRPCλŠ” HTTP/2 기반이기 λ•Œλ¬Έμ— ν•˜λ‚˜μ˜ 채널 컀λ„₯μ…˜μ„ λ§Ίκ³  κ·Έ 컀λ„₯μ…˜μ„ ν†΅ν•΄μ„œ λ™μ‹œμ— λ©”μ‹œμ§€λ₯Ό 보내고 μ²˜λ¦¬ν•  수 있음
    • 이런 이유둜 전체적인 톡신 μ†λ„μ˜ ν–₯상 λ˜ν•œ 크게 κΈ°λŒ€ν•  수 있음
  • gRPCμ—μ„œ ν΄λΌμ΄μ–ΈνŠΈ μ‘μš© ν”„λ‘œκ·Έλž¨μ„ μ„œλ²„μ—μ„œ ν•¨μˆ˜λ₯Ό λ°”λ‘œ 호좜 ν•  수 μžˆμ–΄ λΆ„μ‚° MSA(Micro Service Architecture, 마이크둜 μ„œλΉ„μŠ€ 아킀텍쳐)λ₯Ό μ‰½κ²Œ κ΅¬ν˜„ν•  수 있음
    • μ„œλ²„ μΈ‘μ—μ„œλŠ” μ„œλ²„ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ³  gRPC μ„œλ²„λ₯Ό μ‹€ν–‰ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈ ν˜ΈμΆœμ„ 처리

  • gRPCλŠ” νŠΉμ§•μœΌλ‘œ λ‹€μ–‘ν•œ 개발 ν™˜κ²½μ—μ„œ RPCκ°€ κ°€λŠ₯ν•˜λ„λ‘œ 지원해주고 있음

Tip! μΆ”κ°€ λ‚΄μš©

  • gRPC(google Remote Procedure Call)λž€ κ΅¬κΈ€μ—μ„œ λ§Œλ“  원격 ν”„λ‘œμ‹œμ € 호좜 ν”„λ ˆμž„μ›Œν¬
  • κΎΈμ€€νžˆ μ—…λ°μ΄νŠΈ λ˜κ³ μžˆλŠ” μ˜€ν”ˆ μ†ŒμŠ€λ‘œ μ„±λŠ₯이 맀우 μ’‹κ³  μ–΄λ– ν•œ ν™˜κ²½μ—μ„œλ„ μ‹€ν–‰μ‹œν‚¬ 수 μžˆλ‹€λŠ” μž₯점을 가지고 μžˆμ–΄ 이미 λͺ‡ λ…„ μ „λΆ€ν„° κ°κ΄‘λ°›λŠ” 기술
  • λ‘œλ“œ λ°ΈλŸ°μ‹±, 좔적(trace), μƒνƒœ 확인 및 인증을 μœ„ν•œ ν”ŒλŸ¬κ·Έν˜• 지원을 톡해 μ„œλΉ„μŠ€λ₯Ό 효율적으둜 μ—°κ²°ν•  수 있음
    • λ˜ν•œ λ””λ°”μ΄μŠ€, λͺ¨λ°”일 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 및 λΈŒλΌμš°μ €λ₯Ό λ°±μ—”λ“œ μ„œλΉ„μŠ€μ— μ—°κ²°ν•˜κΈ° μœ„ν•œ λΆ„μ‚° μ»΄ν“¨νŒ…μ˜ λ§ˆμ§€λ§‰ 단계에도 μ μš©ν•  수 있음
  • κ°•λ ₯ν•œ λ°”μ΄λ„ˆλ¦¬ 직렬화 λ„κ΅¬μ΄μž 언어인 ν”„λ‘œν† μ½œ 버퍼(Protocol Buffer)λ₯Ό μ΄μš©ν•˜μ—¬ μ„œλΉ„μŠ€λ₯Ό μ •μ˜ν•˜κ³ , κ°„κ²°ν•˜κ²Œ λŸ°νƒ€μž„ 및 개발 ν™˜κ²½μ„ μ„€μΉ˜ν•˜κ³  ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•˜μ—¬ μ΄ˆλ‹Ή 수백만 개의 RPC둜 ν™•μž₯ν•  수 μžˆλŠ” μŠ€μΌ€μΌλ§ κΈ°λŠ₯을 제곡
  • λ‹€μ–‘ν•œ μ–Έμ–΄ 및 ν”Œλž«νΌμ— λŒ€ν•΄ ν΄λΌμ΄μ–ΈνŠΈ 및 μ„œλ²„ μŠ€ν…(Stub)을 μžλ™ 생성해쀄 뿐만 μ•„λ‹ˆλΌ μ–‘λ°©ν–₯ 슀트리밍 및 μ™„μ „ν•œ 톡합 인증을 HTTP/2 기반 전솑을 톡해 제곡

gRPCλ₯Ό μ‚¬μš©ν•˜λŠ” 이유

  • 빠름
    • Protocol BuffersλΌλŠ” 방식은 XMLκ³Ό 같이 κ΅¬μ‘°ν™”λœ 데이터λ₯Ό μ§λ ¬ν™”ν•˜λŠ” 방식인데 압좕을 ν•΄μ„œ 훨씬 λΉ λ₯΄κ³ , μ‚¬μš©λ²•λ„ κ°„λ‹¨ν•˜κ³ , λ°μ΄ν„°μ˜ 크기도 μž‘μŒ
    • JSON 직렬화보닀 μ΅œλŒ€ 8λ°° 더 λΉ λ₯Ό 수 μžˆλ‹€κ³  함
  • μ—„κ²©ν•œ 사양 덕뢄에 μƒκΈ°λŠ” κ°€μ΄λ“œμ˜ 쑴재 유무 (IDL)
    • gRPC둜 ν†΅μ‹ ν•˜κΈ° μœ„ν•΄μ„œλŠ” Protocol Buffers둜 μ–΄λ–»κ²Œ 데이터λ₯Ό μ£Όκ³  받을 것인지 μ •μ˜ν•΄λ†”μ•Ό 함
    • κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 데이터λ₯Ό μ£Όκ³  받을 λ•ŒλŠ” μ–΄λ–€ ν˜•μ‹μœΌλ‘œ μ „λ‹¬ν•΄μ•Όν•˜λŠ”μ§€μ— λŒ€ν•œ κ°€μ΄λ“œκ°€ μ½”λ“œλ‘œ μƒμ„±λ˜κΈ° λ•Œλ¬Έμ— λ”°λ‘œ API λ¬Έμ„œκ°™μ€ 것을 λ§Œλ“€ ν•„μš”κ°€ μ—†κ²Œ λ˜λŠ” 것
    • μ—¬λŸ¬ νšŒμ‚¬μ—μ„œλ„ 이런 μ—„κ²©ν•œ 사양 덕뢄에 개발 생산성이 λ†’μ•„μ§€λŠ” μ΄μœ λ„ μžˆμ–΄μ„œ gRPCλ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ λ‹€μˆ˜ 있음
  • HTTP/2
    • gRPCλŠ” HTTP/2λ₯Ό 지원
    • gRPCλŠ” HTTP/1.1κ³Ό ν˜Έν™˜λ˜μ§€λ§Œ HTTP/2만의 κ³ κΈ‰ κΈ°λŠ₯듀도 μ‚¬μš©ν•  수 있음
      • λ™μΌν•œ μ—°κ²°λ‘œ 병렬적인 μš”μ²­μ„ μ²˜λ¦¬ν•  수 있고, 연결을 μœ μ§€ν•΄μ„œ 맀번 연결을 λ‹€μ‹œ ν•˜λŠ”λ° μ‚¬μš©λ˜λŠ” λΉ„μš©λ„ 쀄일 수 있음

gRPC μž₯단점

  • μž₯점
    • μ„±λŠ₯κ³Ό 문제점 κ°œμ„ 
      • HTTP 1.1은 μ›Ήμ—μ„œ κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ” ν”„λ‘œν† μ½œμ΄κ³ , JSON은 맀우 κ°„λ‹¨ν•˜λ©΄μ„œ 효율적인 IDLμ΄μ§€λ§Œ 일뢀 문제점 쑴재
        • JSON IDL의 ν¬κΈ°λ‚˜ HTTP 1.1의 HOLB 문제 λ“±
      • gRPC의 Protocol Buffers둜 λ¦¬μ†ŒμŠ€ μ‚¬μš©λŸ‰μ„ 크게 쀄여 JSON을 μ‚¬μš©ν•  λ•Œλ³΄λ‹€ 응닡속도λ₯Ό 쀄일 수 있음
        • JSON 및 XML둜의 λ³€ν™˜λ„ 지원
    • Server-Client 슀트리밍
      • HTTP/2 νŠΉμ§•μœΌλ‘œ Multiduplex Bidirectional Streaming κΈ°λŠ₯ 제곡
    • λ‹€μ–‘ν•œ μ–Έμ–΄μ—μ„œ μ‚¬μš© κ°€λŠ₯
      • proto3μ—μ„œ C#, C+, Dart, Go, Java, Kotline, Node, Object-C, PHP, Python, Ruby 지원
  • 단점
    • λΈŒλΌμš°μ € μ‚¬μš©μ΄ κ³€λž€ν•¨
      • λΈŒλΌμš°μ €μ—μ„œ proto νŒŒμΌμ„ 가지고 μžˆμ„ 수 μ—†μœΌλ―€λ‘œ 사싀상 μ‚¬μš© λΆˆκ°€λŠ₯
    • ν΄λΌμ΄μ–ΈνŠΈ μ—…λ°μ΄νŠΈμ‹œ .proto νŒŒμΌμ„ μ—…λ°μ΄νŠΈ ν•΄μ£Όμ–΄μ•Ό 함
      • μ„œλ²„μ˜ proto νŒŒμΌμ— λ³€ν™”κ°€ 생길 경우 ν΄λΌμ΄μ–ΈνŠΈμ˜ proto νŒŒμΌλ„ μ—…λ°μ΄νŠΈ ν•„μš”

gRPC와 HTTP API 비ꡐ

gRPC의 RPC μ’…λ₯˜

  • Rest APIλŠ” Request & Response을 가짐
  • μ΄μ™€λŠ” λ‹€λ₯΄κ²Œ gRPCλŠ” λ‹€μ–‘ν•œ μš”μ²­ & 응닡 λͺ¨λΈμ„ μ œκ³΅ν•˜κ³  있음
    • 이런 λ‹€μ–‘ν•œ 톡신 λͺ¨λΈμ„ κ°€μ§ˆ 수 μžˆλŠ” μ΄μœ λŠ” gRPCλŠ” HTTP/2λ₯Ό 기반으둜 μ‚¬μš©ν•˜κ³  있으며 이에 따라 ν•˜λ‚˜μ˜ 컀λ„₯μ…˜μœΌλ‘œ μ—¬λŸ¬ 개의 데이터λ₯Ό 보낼 수 μžˆλŠ” μŠ€νŠΈλ¦Όμ„ μ§€μ›ν•˜κΈ° λ•Œλ¬Έ
  • Unary RPC
    • ν•˜λ‚˜μ˜ request에 ν•˜λ‚˜μ˜ responseλ₯Ό κ°€μ§€λŠ” λͺ¨λΈ
  • Server Streaming RPC
    • ν•˜λ‚˜μ˜ request에 μ—¬λŸ¬κ°œμ˜ responseλ₯Ό κ°€μ§€λŠ” λͺ¨λΈ
  • Cleint Streaming RPC
    • μ—¬λŸ¬κ°œμ˜ request에 ν•˜λ‚˜μ˜ responseλ₯Ό κ°€μ§€λŠ” λͺ¨λΈ
  • Bidirection Streaming RPC
    • μ—¬λŸ¬κ°œμ˜ request에 μ—¬λŸ¬κ°œμ˜ requestλ₯Ό κ°€μ§€λŠ” λͺ¨λΈ

gRPC 적용

Node.js

uju's Tech - Node.jsμ—μ„œ gRPC μ„€μΉ˜
gRPC 예제
μ™„μ „ν•œ 마이크둜 μ„œλΉ„μŠ€ μžμŠ΅μ„œ

Django

gRPC

profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 λŒ“κΈ€