IT's Jenna

websocket : 끊겼을때 재시작 하기 (node.js / twelvedata) 본문

Backend/외부 API 활용

websocket : 끊겼을때 재시작 하기 (node.js / twelvedata)

developer Jenna 2022. 5. 10. 20:23

최근에 주식 관련 프로젝트를 진행 중입니다. 이후 포스팅에서 관련해서 자세히 다루도록 하겠습니다 :)

주식 데이터는 twelvedata라는 곳에서 실시간으로 받아와야 하기 때문에 websocket을 통해서 데이터를 받아옵니다.

 

서버와 twelvedata를 websocket으로 연결시켜 두면 여러 이유들로 인해 websocket이 끊기는 현상이 발생하게 됩니다.

하지만 실시간 주식 정보를 받아와야하는 app에서 연결이 끊겨서 데이터를 받아오지 못한다면 큰 문제가 되겠죠?

 

따라서 websocket 연결이 끊기더라도 다시 자동으로 재연결 되도록 코드 작업을 해두었습니다.

 

function twelveDataConnect(){
  const webSocket = new WebSocket(`wss://ws.twelvedata.com/v1/quotes/price?apikey=${config.key}`)

webSocket.onopen = async () => {
  console.log('connection good')
  const body = JSON.stringify({
    action: 'subscribe',
    params: {
      symbols: Symbols
    }
  })
  webSocket.send(body)

  webSocket.onmessage = async (e) => {
    // console.log('message', e)
    // console.log('data', e.data)
    const data = JSON.parse(e.data)
	...

 	const interval = setInterval(() => {
      const heartbeat = JSON.stringify({
      action: 'heartbeat'
      })
      webSocket.send(heartbeat)
    }, 10000)
}

  webSocket.onclose = async (e) => {
    console.log('Socket is closed. Reconnect will be attempted in 1 second.', e);
    setTimeout(function() {
      twelveDataConnect();
    }, 1000);
  }
}

twelveDataConnect()

 

웹소켓 연결부터 연결된 후의 모든 동작을 twelveDataConnect() 라는 하나의 함수 내에 넣어두고 해당 함수를 실행합니다.

웹소켓이 onclose되는 시점에 setTimeout을 걸어서 종료 1초 후에 다시 웹소켓을 연결하도록 해두면 상용 서버에서 혹시나 웹소켓 연결이 끊기더라도 다시 재연결할 수 있습니다.

 

참조

https://stackoverflow.com/questions/22431751/websocket-how-to-automatically-reconnect-after-it-dies

 

 

Comments