
서비스 운영 중, 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분을 주었다.