HTTP/2는 알고보니 RPC프레임워크 이었다.

GHTS 2019. 10. 12. 15:58 Posted by 정직한 UnHa Kim

HTTP는 문자열에 기반한 요청과 응답이 1:1 대응되는 프로토콜로만 알고 있었는 데,

뒤늦게 HTTP 2.0에 대해 알아보니,

바이너리에 기반한 M:N의 양방향 RPC프로토콜로 변해있었다.

 

참고 : https://developers.google.com/web/fundamentals/performance/http2

 

GHTS에서 API호출 프로세스와 나노메시지(nanomsg)를 RPC프레임워크로 사용하고 있다.

 

애초에는 zeroMQ를 사용했으나,

zeroMQ가 C++기반이라서 컴파일이 너무 느려서 개발 작업에 많은 방해가 되던 차에

nanomsg는 zeroMQ와 비슷한 기능을 가지면서도,

Go언어 구현체인 go-mangos의 존재 덕분에 컴파일 속도가 확연히 빨라져서,

개발 속도 향상에 많은 도움을 받았으며 그간 나름 만족스럽게 사용하고 있었다.

 

그러나, nanomsg는,

- 적은 수의 개발자

- 충분히 증명되지 않은 안정성

- 충분히 증명되지 않은 최적화

등의 문제로 인해서 찜찜한 면이 있었다.

 

HTTP/2는 구글의 SPDY를 토대로 수많은 수정과 초안을 거치며 규격이 정해진 데다가,

여러 인터넷 기업에서 사용되면서 안정성과 최적화 문제가 자연스럽게 해결된 상태인데다가,

Go언어 표준라이브러리에 포함되어 있기에 컴파일 속도까지 향상되므로,

여러모로 유리할 것 같아서,

RPC프레임워크를 nanomsg에서 HTTP/2로 바꾸는 게 낫겠다는 생각을 하게 되었다.

 

물론, 구글에서 gRPC라고 HTTP/2기반의 RPC프레임워크를 공개해 놨지만,

protocol buffer로 자료 변환을 하는 방식이 오히려 불편하게 느껴져서,

gRPC는 현 상황에서는 불필요한 복잡성만 도입하는 듯 하여 고려 대상에서 제외했다.

 

HTTP/2에 기반한 간단한 양방향 호출 예제는 h2conn을 참고하였다.

 

https://github.com/posener/h2conn

 

정말 단순하게 IPC를 실행하는 게 감동적이었다.

 

h2conn 예제는 json, gob 인코딩을 사용해서 문자열을 주고 받도록 되어 있는 데,

encoding/binary 패키지를 사용해서 바이너리 데이터를 주고받도록 변경하면,

그 즉시 RPC프레임워크로 바로 사용할 수 있을 듯 하다.

 

 

 

댓글을 달아 주세요