gRPC Node.js 클라이언트에서 Deadline 설정하기
문제 상황
주문 서비스에서 재고 서비스를 gRPC로 호출하는데, 재고 서비스가 느려지면서 주문 서비스까지 영향을 받는 상황이 발생했다. 타임아웃 설정 없이 무한정 대기하면서 커넥션 풀이 고갈되는 문제였다.
Deadline 설정
gRPC는 HTTP/2 기반이라 일반적인 socket timeout과는 다르게 동작한다. Deadline을 통해 요청 전체의 시간 제한을 설정할 수 있다.
const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');
const packageDefinition = protoLoader.loadSync(
'inventory.proto',
{
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true
}
);
const inventoryProto = grpc.loadPackageDefinition(packageDefinition).inventory;
const client = new inventoryProto.InventoryService(
'inventory-service:50051',
grpc.credentials.createInsecure()
);
// Deadline 설정 (3초)
const deadline = new Date();
deadline.setSeconds(deadline.getSeconds() + 3);
client.checkStock(
{ productId: '12345' },
{ deadline: deadline.getTime() },
(error, response) => {
if (error) {
if (error.code === grpc.status.DEADLINE_EXCEEDED) {
console.error('재고 조회 타임아웃');
// fallback 로직
}
return;
}
console.log('재고:', response.stock);
}
);
적용 결과
- 재고 서비스 장애 시 주문 서비스가 3초 내로 응답하도록 개선
- 전체 시스템의 장애 전파 방지
- 모니터링에서
DEADLINE_EXCEEDED에러를 추적해 병목 지점 파악 가능
주의사항
Deadline은 단일 RPC 호출뿐 아니라 재시도까지 포함한 전체 시간이다. 재시도 로직이 있다면 이를 고려해서 설정해야 한다. 우리는 재시도 없이 빠른 실패(fail-fast) 전략을 선택했다.