[TOC]
gRPC๋ Google์์ ๊ฐ๋ฐํ RPC(Remote Procedure) ์์คํ ์ด๋ค. ์ ์ก์ ์ํด TCP/IP ํ๋กํ ์ฝ๊ณผ HTTP 2.0 ํ๋กํ ์ฝ์ ์ฌ์ฉํ๊ณ IDL(Interface Definition Language)๋ก protocol buffer๋ฅผ ์ฌ์ฉํ๋ค.
RPC(์๊ฒฉ ํ๋ก์์ ํธ์ถ)๋ ํ ํ๋ก๊ทธ๋จ์ด ๋คํธ์ํฌ์ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ดํดํ์ง ์๊ณ ๋ ๋คํธ์ํฌ ์์ ๋ค๋ฅธ ์ปดํจํฐ์ ์๋ ํ๋ก๊ทธ๋จ์์ ์๋น์ค๋ฅผ ์์ฒญํ๋ ํ๋กํ ์ฝ์ด๋ค. RPC๋ client-server ๋ชจ๋ธ์ ์ฌ์ฉํ๋ค. ํด๋ผ์ด์ธํธ์์ ์๋น์ค๋ฅผ ์์ฒญ(function call)ํ๋ฉด ์๋ฒ์์ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ค.
RPC ๊ฐ๋
HTTP(Hypertext Transfer Protocol)๋ ์น์ด์ ์ฐ์ด๋ ํต์ ํ๋กํ ์ฝ์ด๋ค. ํ๋กํ ์ฝ์ด๋ ์ํธ๊ฐ์ ์ ์ํ ๊ท์น์ ์๋ฏธํ๋ค.
HTTP ํ๋กํ ์ฝ์ TCP/IP ํ๋กํ ์ฝ ์์ ๋ ์ด์ด(Application layer)์์ ๋์ํ๋ค.
HTTP ํ๋กํ ์ฝ์ stateless ํ๋กํ ์ฝ์ด๋ค. ์ฌ๊ธฐ์ ์ํ๊ฐ ์๋ค๋ ์๋ฏธ๋ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํ ๊ฐ๊ฐ์ ๋ฐ์ดํฐ ์์ฒญ์ด ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌ๋๋ค๋ ์๋ฏธ์ด๋ค.
HTTP๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฒ-ํด๋ผ์ด์ธํธ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฆ ๋๋ค. ์ด ๊ตฌ์กฐ์์ HTTP ํ๋กํ ์ฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด์๋ Request๋ฅผ ๋ณด๋ด๊ณ , Response๋ฅผ ๋ฐ์์ผํ๋ค.
- HOLB(Head Of Line Blocking) ํน์ ์๋ต ์ง์ฐ
- RTT(Round Trip Time)์ฆ๊ฐ
- heavy header
HTTP1.1์ ํ๋กํ ์ฝ์ ๊ณ์นํด ๋์ผํ API๋ฉด์ ์ฑ๋ฅ ํฅ์์ ์ด์ ์ ๋ง์ท๋ค.
XML์ ์ด๋ ํ ๋ฐ์ดํฐ๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ์ด๋ฆ์ ์์๋ก ์ง์ ํ๊ทธ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ธ๋ฉฐ, ํ๊ทธ๋ก ์ฌ์ฉ์๊ฐ ์ง์ ํ๊ทธ๋ก ์ฌ์ฉ์๊ฐ ์ง์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์ํ ์ ์๋ค.
HTTP + XML ์กฐํฉ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋๋ค.
XML์ด ๊ฐ์ง ์ฝ๊ธฐ ๋ถํธํ๊ณ , ๋ณต์กํ๊ณ , ๋๋ฆฐ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. ํนํ key-value๋ก ์ ์๋ ๊ตฌ์กฐ ์์ฒด๊ฐ ๊ต์ฅํ ์ฌ๋์๊ฒ ์ง๊ด์ ์.
HTTP + RESTful API + JSON ์กฐํฉ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋จ.
XML์ ๋ฌธ์ ์ ์ ๊ฐ์ ํ๊ธฐ ์ํด ์ ์๋ IDL์ด๋ฉฐ, XML๋ณด๋ค ์๋ฑํ ์ฑ๋ฅ์ ์ง๋๋ค.
Protocol buffers๋ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํ(serialization)ํ๊ธฐ ์ํ ํ๋กํ ์ฝ๋ก XML๋ณด๋ค ์๊ณ , ๋น ๋ฅด๊ณ , ๊ฐ๋จํ๋ค. XML ์คํค๋ง์ฒ๋ผ .proto ํ์ผ์ protocol buffer ๋ฉ์ธ์ง ํ์ ์ ์ ์ํ๋ค.
Protocol buffers๋ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํํ๋๋ฐ ์์ด์ XML๋ณด๋ค ๋ง์ ์ฅ์ ๋ค์ ๊ฐ์ง๊ณ ์๋ค.
- ๊ฐ๋จํ๋ค
- ํ์ผ ํฌ๊ธฐ๊ฐ 3~10๋ฐฐ ์ ๋ ์๋ค
- ์๋๊ฐ 20~100๋ฐฐ ์ ๋ ๋น ๋ฅด๋ค
- XML๋ณด๋ค ๊ฐ๋ ์ฑ์ด ์ข๊ณ ๋ช ์์ ์ด๋ค.
gRPC๋ ๊ตฌ๊ธ์์ ๋ง๋ RPC ํ๋ซํผ์ด๋ฉฐ protocol buffer์ RPC๋ฅผ ์ฌ์ฉํ๋ค.
์ต์ ๋ฒ์ ์ IDL๋ก proto3๋ฅผ ์ฌ์ฉํ๋ค. Java, C++, Python, Java Lite, Ruby, JavaScript, Objective-C ๋ฐ C#์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
SSL/TLS๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ๋ฅผ ์ธ์ฆํ๊ณ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ์ ๊ตํ๋๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๋ค. HTTP 2.0์ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ด ๋ฐ์ด๋๊ณ ํ์ฅ ๊ฐ๋ฅํ API๋ฅผ ์ง์ํ๋ค.
gRPC์์ ํด๋ผ์ด์ธํธ ์์ฉ ํ๋ก๊ทธ๋จ์ ์๋ฒ์์ ํจ์๋ฅผ ๋ฐ๋ก ํธ์ถ ํ ์ ์์ด ๋ถ์ฐ MSA๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค. ์๋ฒ ์ธก์์๋ ์๋ฒ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ gRPC ์๋ฒ๋ฅผ ์คํํ์ฌ ํด๋ผ์ด์ธํธ ํธ์ถ์ ์ฒ๋ฆฌํ๋ค.
Protocol buffer๋ ๊ตฌ์กฐํ ๋ฐ์ดํฐ(structured data)๋ฅผ ์ง๋ ฌํ(seriailize)ํ๊ธฐ์ํ Google์ ์ธ์ด ์ค๋ฆฝ์ , ํ๋ซํผ ์ค๋ฆฝ์ ์ด๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ ๋ฉ์ปค๋์ฆ์ด๋ค.
XML๋ณด๋ค ์์ง๋ง, XML๋ณด๋ค ๋น ๋ฅด๊ณ ๋จ์ํ๋ค.
IDL(Interface Definition Language)๋ก์ data structure๋ฅผ ์ ์ํ ๋ค์, .proto ํ์ผ์ protocol buffer compiler(protoc)๋ฅผ ์ด์ฉํด compile ํฉ๋๋ค. Complie๋ ์์ค ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ๋ฐ์ดํฐ์คํธ๋ฆผ์์ ๋ค์ํ ์ธ์ด๋ก ๋ค์ํ ๊ตฌ์กฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์ฝ๊ณ ์ธ ์ ์๋ค.
ํ๋กํ ์ฝ ๋ฒํผ๋ ํ์ฌ Java, Python Objective-C ๋ฐ C++์์ ์์ฑ๋ ์ฝ๋๋ฅผ ์ง์ํ๋ค. ์๋ก์ด proto3๋ฒ์ ์ ์ฌ์ฉํ๋ฉด proto2์ ๋นํด ๋ ๋ง์ ์ธ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Protocol buffers๋ ํฌ๊ฒ proto2์ proto3๊ฐ ์์ง๋ง gRPC์์ ์ต์ ๋ฒ์ ์ธ proto3๋ฅผ ์ฌ์ฉํ๋ค.
syntax = "proto3"; //syntax๊ฐ ์์ผ๋ฉด ์๋์ผ๋ก proto2๋ก ์ธ์๋จ
message SearchRequest {
string query = 1;
int32 page_number = 2;
int32 result_per_page = 3;
}
SearchRequest ๋ฉ์์ง ์ ์๋ ์ด ์ ํ์ ๋ฉ์์ง์ ํฌํจํ๋ ค๋ ๊ฐ ๋ฐ์ดํฐ์ ๋ํด ํ๋์ฉ ์ธ ๊ฐ์ ํ๋(ํค, ๊ฐ)๋ฅผ ์ง์ ํ๋ค. ๊ฐ ํ๋์๋ ํค์ ๊ฐ์ด ์๋ค.
์์ ์์์์ ๋์จ Field types๋ ๋ชจ๋ scalar types์ด๋ค. (int32, string)
ํ์ง๋ง scalar type ๋ฟ๋ง ์๋๋ผ enum๊ณผ ๊ฐ์ ๋ค๋ฅธ field type๋ ์ ์ธ ๊ฐ๋ฅํ๋ค.
๊ฐ field๋ unique number๋ฅผ ๊ฐ๋๋ค.
์ด field number๋ ๋ฉ์ธ์ง binary format์์ field๋ฅผ ์๋ณํ๋๋ฐ ์ฌ์ฉ๋๋ค. ์ฆ field number๊ฐ key๊ฐ ๋๊ณ field type์ด value๊ฐ ๋๋ ํด์ ๊ตฌ์กฐ๋ฅผ ์ง๋๋ค.
Field numbers์ ๊ฐ์ด 1~15 ์ฌ์ด๋ฉด 1 byte๋ก encoding๋๋ค.
Field numbers์ ๊ฐ์ด 16~2047์ด๋ฉด 2 bytes๋ก encoding๋๋ค.
๊ทธ๋ ๊ธฐ์ Field numbers์ ๊ฐ์ 1~15 ์ฌ์ด๋ก encoding ํ๋๊ฒ์ด ํจ์จ์ ์ด๋ค.
๋ฉ์ธ์ง fields๋ ๋ค์ ์ค ํ ๊ฐ์ง๋ฅผ ๋ฐ๋ฅธ๋ค.
- singular: well-formed๋ ๋ฉ์ธ์ง๋ ํ๋ ์ดํ์ ๊ฐ์ ๊ฐ์ง ์ ์๋ค.
- repeated: ์ด field๋ ์ฌ๋ฌ๋ฒ ๋ฐ๋ณต๋ ์ ์๋ค.
ํ๋์ .proto ํ์ผ ์์ ๋ค์ค ๋ฉ์ธ์ง type์ด ์ ์๋ ์ ์๋ค.
message SearchRequest {
string query = 1;
int32 page_number = 2;
int32 result_per_page = 3;
}
message SearchResponse {
...
}
.proto ํ์ผ์ protocol buffer compiler์ ์ํด compiled๋๋ฉด, ๋ฉ์ธ์ง๋ serializing๋์ด output stream์ผ๋ก ๋๊ฐ๊ณ parsing๋์ด input stream์ผ๋ก ๋ค์ด์จ๋ค.
์ปดํ์ผ๋ฌ๋ ํ์ผ์ ์ค๋ช ๋ ๊ฐ ๋ฉ์ธ์ง type์ ๋ํ class์ ํจ๊ป ๊ฐ .proto์์ .h ๋ฐ .ccํ์ผ์ ์์ฑํ๋ค.
์ปดํ์ผ๋ฌ๋ ๊ฐ ๋ฉ์ธ์ง type์ ๋ํ class์ ๋ฉ์ธ์ง class instance ์์ฑ์ ์ํ builder class๊ฐ ์๋ .java ํ์ผ์ ์์ฑํ๋ค.
์ปดํ์ผ๋ฌ๋ ๊ฐ ๋ฉ์ธ์ง type์ static discriptor๊ฐ ์๋ ๋ชจ๋์ ์์ฑํ ๋ค์, meta class์ ํจ๊ป ๋ฐํ์์ ํ์ํ Python data access class๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.