인프라/CI-CD

[aws] WebSocket 1분 단위로 끊기는 문제..

2023. 11. 13. 01:01
글 목차


728x90

SpringBoot로 webSocket을 구현했는데, 1분단위로 세션이 끊기는 문제가 발생했다.

 

일단 클라이언트 단에서 세션이 끊길경우 재 연결하는 코드를 넣어 두긴했는데,,

 

당연히 세션이 안끊기는게 맞는 거 아닌가 싶어서 다음과 같이 땜질을 해두었다.

 

 

문제는 aws EC2는 1분간 클라이언트와 서버간의 데이터 송수신이 없으면 연결을 끊어 버린다는데 있었다.

그래서 30초에 한번씩 서로 핑퐁을 주고 받는 것으로 땜질

 

서버

@Scheduled(fixedDelay = 30000)
public void ping() throws Exception {
    HashMap<String, Object> dto = new HashMap<>();
    dto.put("code", "ping");
    for (WebSocketSession wss : webSocketSessionSet) {
        wss.sendMessage(new TextMessage(mapper.writeValueAsString(dto)));
    }
}

이 메서드를 소켓핸들러 클래스에 넣었다.

 

주의 할 것은 스프링 어플리케이션을 런 하는 클래스에서도 어노테이션을 다음과 같이 추가해야 된다.

@EnableScheduling
@SpringBootApplication
public class MinesweeperApplication {
    public static void main(String[] args) {
        SpringApplication.run(MinesweeperApplication.class, args);
    }
}

위와 같이 @EnableScheduling을 추가 해줘야 한다.

 

fixedDelay 30000은 30초에 한번씩 실행한다는 뜻 

 

 

클라이언트

conn.onmessage = async (msg) => {
    var dto = JSON.parse(msg.data);
    console.log(dto);
    var code = dto.code;
    var value = dto.value;
    if (code == "ping") {
        console.log("핑을 받았어요, 퐁을 보낼게요");
        socket_send({event: "pong", data: {id: myPlayer.session_id}});
    }
}

이렇게 연결 받은것을 다시 보내면 30초에 한번씩 클라이언트와 서버가 통신하게 되어 연결이 끊기지 않는다.

30초짜리 메서드를 3번 실행해도 연결이 끊기 않는 모습이다.

728x90
[aws] WebSocket 1분 단위로 끊기는 문제..