티스토리 뷰
golang 환경에서 grpc로 서버를 개발하다보면, grpc conn 객체를 어떻게 관리할지 항상 고민이었습니다.
여러 클라이언트와 통신하면 각자 커넥션을 맺어야할지,
여러번 통신하면 Dial을 매번 요청해야할지,
conn 객체와 client 객체 중 무엇을 보관해야하는지
구글링을 통해 얻은 grpc 다루는 노하우에 대해 정리하겠습니다.
https://github.com/grpc/grpc-go/issues/682
grpc-go github에서의 토론은 다음과 같습니다.
여러 클라이언트와 통신하더라도 conn 객체는 하나면 충분하다.
grpc 내부에서 적절히 multiplexing한다.
여러 커넥션을 맺고 재활용할지 등에 대한 토론이었고, 결론은 하나의 커넥션만으로도 충분하다 였습니다.
내부적으로 알아서 잘 한다가 결론입니다.
https://stackoverflow.com/questions/56067076/grpc-connection-management-in-golang
스택오버플로우에서의 답변은 다음과 같습니다.
grpc 커넥션은 하나면 충분하다.
conn 객체를 패키지 전역 변수로 보관하는 것은 설계적으로 좋지 않다.
go 기본 라이브러리의 `context`개념을 활용하라.
conn 객체 대신 client 객체를 보관하고, context 관리한다.
역시 커넥션은 하나면 충분하고, 대신 conn 객체보단 client 객체를 관리하는 케이스가 더 일반적인 것 같았습니다.
https://blog.banksalad.com/tech/production-ready-grpc-in-golang/
뱅크샐러드 블로그에선 다음과 같이 가이드하였습니다.
conn 객체 대신 client 객체를 전역 변수에서 다룬다.
대신 `sync.Once`를 통해 싱글톤으로 제공한다.
grpc_middleware 를 적극 활용하여 재연결 로직, 로깅 등을 처리한다.
IDL파일을 공통으로 관리하고, 연결 맺는 함수, 연결 객체 관리 등 많은 것을 배울 수 있었습니다.
'코드읽기' 카테고리의 다른 글
github.com/argoproj/argo 코드 살펴보기 (0) | 2020.05.07 |
---|---|
golang httpmq 코드 분석 (0) | 2019.12.27 |