gRPC 헬스체크, HTTP만으론 부족한 이유
HTTP /health가 200을 반환해도, 같은 프로세스 안의 gRPC 서버는 죽어 있을 수 있습니다. 표준 gRPC 헬스체크를 함께 등록해야 하는 이유와 붙이는 방법을 정리합니다.
헬스체크란
헬스체크는 오케스트레이터(쿠버네티스, ECS 등)가 각 서버가 살아 있는지 주기적으로 확인하는 절차입니다. "정상"이라고 답하면 트래픽을 보내고, "비정상"이면 트래픽을 끊거나 재시작합니다.
비유하면 건강검진입니다. 문을 두드려 "계세요?"에 대답만 하는 것과, 실제로 진료해서 "일할 수 있는 상태인가"를 보는 것은 다릅니다. 헬스체크는 후자여야 합니다.
왜 HTTP만으론 부족한가
HTTP 헬스체크만으로는 같은 프로세스 안의 gRPC 서버가 죽었는지 알 수 없기 때문입니다. 많은 서비스가 한 프로세스에서 HTTP 서버와 gRPC 서버를 함께 띄웁니다. HTTP는 외부 요청용, gRPC는 서비스 간 통신용입니다.
이때 헬스체크를 HTTP /health로만 하면 문제가 생깁니다.

gRPC 서버가 죽었는데 HTTP /health는 멀쩡히 200을 돌려줬습니다. 오케스트레이터는 "이 서버 정상"이라 판단하고 트래픽을 계속 보냈고, 그쪽으로 간 gRPC 요청은 전부 실패했습니다. 정상 서버와 섞여 있어 실패율이 어중간했고, "죽었다"가 안 보여 오래 갔습니다. (회고: 모노레포 편)
원인은 단순합니다. 두 서버를 띄웠는데 헬스의 답이 하나뿐이었습니다. HTTP가 살아 있다고 gRPC가 살아 있는 게 아닙니다.
표준 gRPC 헬스체크 붙이기
gRPC 헬스체크는 세 단계로 붙입니다. ① 서버에 표준 Health 서비스를 등록하고, ② 오케스트레이터가 gRPC 상태를 직접 확인하게 하고, ③ 종료 시 graceful shutdown으로 트래픽을 빼냅니다.
gRPC에는 표준 헬스체크 프로토콜(grpc.health.v1.Health)이 있습니다. 서버에 이 서비스를 등록하면, 오케스트레이터가 gRPC 쪽 상태도 직접 물어볼 수 있습니다.