본문 바로가기
OPS(Infra)/AWS

[AWS] EC2에서 사용하는 채팅 서비스(socket.js / sockJs 등등)에 대해서(EC2에서 채팅 서버가 끊기는 현상)

by hwan20c 2022. 11. 15.

로컬에서 chat server를 구현했을 때는 아주 잘 돌아갔다.

 

그런데 EC2에 서버를 올리니 chat 서버에 접속하고 아무 동작을 하지 않고 60초가 지나니 자동으로 접속이 끊어지는 것이었다...

 

확인을 해보니 일반적인 spring socket에서는 heartbeat를 check 하는 기능이 없어서,

 

SockJS를 쓰거나 STOMP를 써야 한다는 것이었다.

그래서 원래
 
Websocket SERVER(JAVA) 쪽에서는
 
 

이렇게 되어 있었고, 

 

Client 쪽에는

이렇게 되어있었다.(주석을 풀어야 한다)

 

하지만 저렇게 하면 EC2에서 계속 끊겼다.

 

그래서 heartbeat 혹은 ping pong 시스템을 만들고 싶었는데,

 

heart beat는 보통 client에서 주기적으로 신호를 보내게 작성하는 것이 아니라, server에서 health check를 하게끔 만들어진다는 것을 알았고,

 

SockJS나 STOMP를 써야 하는데, 일단은 SockJS를 쓰기로 했다.

 

그래서 코드를 

이런 식으로 고쳤는데, 고친 코드를 보면

 

handler추가는 같고,

 

원래는 setAllowdOrigin으로 되어있었는데,

이렇게 하면 어떤 브라우저에서는 되고 어떤 브라우저에서는 안 되는 이슈가 있었고(CORS 때문에 그렇다고 한다.),

애초에 에러 자체가 나왔을 때 setAllowedOriginPatterns를 권유를 하고 있었다.

그래서 이렇게 바꾸게 되었고,

 

withSockJS()는 SockJS를 쓰겠다는 것

 

setClientLibraryUrl은

 

IE 8, 9를 쓰는 사용자를 위해 해당 서버 websocket js로 설정하는 것이다.

(사진은 저렇게 되어있는데, setCLientLibraryUrl을 정의로 이동해서 들어가도 저런 식으로 설정해도 된다고 적혀있긴 하다.)

(원래는 http://localhost:8080/{SockJS를 사용하는 파일 경로}로 설정해주면 된다.)

 

그리고 대망의 Heartbeat Time인데,

원래 설정을 안 해도 기본적으로 SockJS에는 Heartbeat를 체크하는 걸로 알고 있다.(기본값 25초 코드는 30초로 설정되어있다.)

 

저걸 설정함으로써, EC2에서 아무 동작도 안 했을 시에 1분이 지나면 끊기는 현상을 해결할 수 있었고,

 

Server단 코드 말고, Client단 도 바꿔줘야 하는데,

 

 
이 script 태그를 js를 쓰는 html에 추가해준 뒤
 

기존에 websocket을 new 하던걸 SockJS를 new 해주면 된다.(해당 로컬의 "/ws/chat"을 찾아간다.)

 

아마 나중에 추가하게 되면

STOMP도 하게 될 거 같은데 언제 할지는 정확히 모르겠다.

일단 EC2에서 채팅이 60초 만에 끊기는 건 해결했다...

댓글