Skip to content

채팅 서버 메모리 누수 및 차단기능

Hoeeeeeh edited this page Dec 5, 2024 · 1 revision

채팅 서버 메모리 누수 해결하기

연결이 끊겼음에도 disconnected 가 되지 않는 경우도 있다.

클라이언트 페이지에서는 유저가 탭을 나가거나 하는 등의 이벤트를 감지해서 서버로 disconnected 이벤트를 발행할텐데, 너무 빠르게 나갔다가 들어갔다 등을 반복해서 그런지 서버에 disconnected 가 정상적으로 들어오지 않는 경우가 있었다.

실제로 socket 이 닫혔는데도 userid - socketid 에 대한 데이터가 삭제되지 않고 남아있어서 추가적으로 클라이언트-서버간의 heartbeat 체크가 필요해진다.

heartbeat 를 어떻게 할 것인가,

Heartbeat/Ping-Pong 방식

  • WebSocket 핑-퐁 프로토콜을 사용하여 서버와 클라이언트 간의 연결 상태를 주기적으로 확인합니다.
  • 서버는 일정 시간 동안 클라이언트로부터 핑 응답이 없으면 클라이언트가 연결을 끊은 것으로 간주합니다.
  • 이를 통해 탭 종료나 네트워크 문제로 인해 disconnected 이벤트가 누락되더라도 서버가 상태를 정확히 파악할 수 있습니다.

서버 예시 (Node.js):

javascript
코드 복사
const clients = new Map();

io.on("connection", (socket) => {
    clients.set(socket.id, { lastPing: Date.now() });

    socket.on("ping", () => {
        clients.get(socket.id).lastPing = Date.now();
    });

    setInterval(() => {
        const now = Date.now();
        for (const [id, client] of clients.entries()) {
            if (now - client.lastPing > 10000) {
                // 10초 이상 응답 없으면 연결 끊음
                clients.delete(id);
                socket.disconnect(true);
            }
        }
    }, 5000);
});

클라이언트 예시:

javascript
코드 복사
setInterval(() => {
    socket.emit("ping");
}, 5000);

그냥 소켓에다가 대고 ping 이벤트를 쏘면서 확인한다.

LiBoo

공통

민지

영길

준서

지수

창현

데일리 스크럼

회의록

발표

일기장

Clone this wiki locally