[22.09.19] Daily 회고록 (stomp failover 문제 해결)
일간 회고록(TIL)

[22.09.19] Daily 회고록 (stomp failover 문제 해결)

[프로젝트]

기존 StompConfig에서는 failover가 제대로 수행되지 않았다. MessageBrokerRegistry에서 failover에 해당하는 url이 동작하지 않았을뿐더러, 따로 세팅하는 곳도 찾기 쉽지 않았다. 또한 ActiveMQ를 사용하다보니 관련 자료를 찾아보았는데 로컬 기반에서 동작하도록 만든 자료들이 많다보니 AmazonMQ에서 지원하는 ActiveMQ는 예제 코드를 찾기 쉽지 않았다.

기존에는 index를 두어 매 접속 시 마다 index를 플립하여 접근을 시도해보도록 구성하였는데, 이 코드는 단점이 많았다. 서버를 최초 실행 시에만 접근하는 것이 아닌, socketAddressSupplier가 사용자가 접근할 때마다도 한 번씩 접근하여, 프론트 단에서 모든 접속이 한 번 성공하면, 다른 한 번은 실패로 이어졌다. 서버의 변수 사용으로 여러 클라이언트에서 하나이 변수를 공유하다 보니 생기는 문제였다. 

근본적인 해결법은 STOMP 연결 성공 시에 성공되는 서버의 인덱스를 남기고, 중간에 서버가 다운되더라도 다른 서버로 바로 이어지도록 수행되야한다는 것이다. 그렇기 때문에 TcpClient의 doOnConnected와 doOnDisconnected를 이용하기로 했다.

최초 1회 성공하기 전까진 index를 이용하여 flipIndex를 통해 기존과 같은 방법으로 접근을 하고, 이것이 ec2에 올라간 스프링 프로젝트에서 진행된다. 그 이후로는 successIndex에 index를 기록해두어 클라이언트에서 웹소켓에 커넥트 시 모두 1회만에 깔끔하게 접근이 가능하였다. 또한, 웹소켓을 연 클라이언트 방(교사 시점)에서 연결되다가 갑자기 끊어지는 경우가 발생하는데, 이를 로드밸런서에서 Idle Timeout이라는 attribute를 60 -> 300으로 변경하고, js에서 disconnect 시 재 connect하도록 코드를 바꿔 재 접속이 가능하도록 구성하였다.

 

 

정상 작동한다