gRPC Connection 관리 : keepAlive 적용

이성민·2024년 10월 16일
0

안드로이드

목록 보기
6/19

이슈 발생

서비스 운영 중, gRPC로 받아오는 실시간 데이터가 현장에서 누락되는 상황이 발생하였다. getState 로 해당 stream channel 의 request connection 상태값을 확인해보았지만 문제가 없었다. channel 이 닫히진 않았지만 실제 데이터는 서버에 전달되지 않는 난감한 상황이 발생한 것이다...

원인 파악

해당 이슈가 발생한 단말기의 로그를 받아보았다. 다행히 이 증상이 발생하는 경우의 공통적인 원인을 파악할 수 있었다. StreamObserver 의 onError 가 한번 트리거 되어있었던 것이다. 네트워크가 불안정하여 서버와의 연결이 끊긴 후 단말기에서는 다시 정상적으로 채널을 연결한 것 처럼 보였지만 실제로는 연결이 안되있던 것이다.

해결방안

따라서 주기적으로 서버와 connection 이 제대로 이뤄지고 있는지 파악 할 수 있는 방법이 필요했다. 하지만 서버 측에서 상태값을 바로 확인할 수 없고, 클라이언트 측에서도 매번 주기적으로 이를 체크 할 방법이 애매하였다.

방법을 찾아보던 중 channel 생성 시에 keepAlive 라는 옵션을 줄 수 있다는 사실을 알게 되었다.

KeepAlive 옵션

keepAliveTime → 새로운 keepalive Ping을 보내기 전에 새 메시지를 기다리는 시간

keepAliveTimeout → 이 시간 내에 keepalive 응답이 수신되지 않으면 연결을 종료

keepAliveWithoutCalls → 아직 처리되지 않은 RPC가 없을 때 연결 유지를 수행할지 여부

최종 조치

필자는 gRPC channel 생성 시 ManagedChannelBuilder 에 keepAliveTime , keepAliveTimeOut 옵션을 적용하였다.

해당 옵션은 서버에 과부하를 줄 수 있어서 time 값을 적절하게 주는 것이 중요했다. 필자는 1분을 주었다.


참고

https://grpc.io/docs/guides/keepalive/

profile
Android Developer 이성민입니다

0개의 댓글