GraphQL subscription - WebSocket 연결 끊김 문제

조제·2024년 11월 15일
0

문제 상황

GraphQL Subscription 기능을 사용하여 WebSocket을 통해 실시간으로 메시지를 전달하는 애플리케이션을 개발하던 중, 메시지 전송이 일정 시간 후 끊기는 문제가 발생했습니다.

로그 확인 결과, 정확히 1분 주기로 WebSocket 연결이 끊어지는 현상이 반복되고 있었습니다.

원인

문제 원인을 파악하기 위해 AWS 환경을 점검한 결과, 로드밸런서의 유휴 제한 시간(Idle Timeout) 설정이 60초로 설정되어 있음을 확인했습니다.

삽질

GraphQL Subscription은 실시간 데이터를 제공하기 위해 WebSocket 프로토콜을 사용합니다.
그러나 WebSocket 연결 유지에는 주기적으로 Ping-Pong 메시지를 주고받아야 하는데, GraphQL Subscription은 스키마에 정의된 필드를 통해서만 메시지를 전송합니다.

따라서 별도의 Ping 메시지를 임의로 보낼 수 없는 구조였습니다.

해결 방법: keepAlive 옵션

문제를 해결하기 위해 GraphQLWsLink 라이브러리의 keepAlive 옵션을 활용했습니다. 이 옵션을 설정하면 클라이언트와 서버 간에 자동으로 Ping-Pong 메시지를 주기적으로 전송하여 연결을 유지할 수 있습니다.

// WebSocket 연결 설정
const wsLink = new GraphQLWsLink(createClient({
    url: 'ws://your-api-endpoint/graphql',
    connectionParams: {
        Authorization: `Bearer your_access_token`
    },
    keepAlive: 50_000 // 50초마다 Ping 메시지 전송
}));


설정 후, 클라이언트와 서버 간 Ping-Pong 메시지가 주기적으로 오가는 것을 확인했습니다. 로드밸런서의 유휴 제한 시간도 더 이상 문제를 일으키지 않았습니다.

profile
조제

0개의 댓글