-
Notifications
You must be signed in to change notification settings - Fork 4
채팅 서버 메모리 누수 및 차단기능
Hoeeeeeh edited this page Dec 5, 2024
·
1 revision
클라이언트 페이지에서는 유저가 탭을 나가거나 하는 등의 이벤트를 감지해서 서버로 disconnected 이벤트를 발행할텐데, 너무 빠르게 나갔다가 들어갔다 등을 반복해서 그런지 서버에 disconnected 가 정상적으로 들어오지 않는 경우가 있었다.
실제로 socket 이 닫혔는데도 userid - socketid 에 대한 데이터가 삭제되지 않고 남아있어서 추가적으로 클라이언트-서버간의 heartbeat 체크가 필요해진다.
heartbeat 를 어떻게 할 것인가,
- 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 이벤트를 쏘면서 확인한다.
- 🚀 웹 소켓의 실시간 양방향 통신 (feat. WS vs Socket.io)
- 🤸♂️ 비제어 컴포넌트로 렌더링 최적화 하기
- 👷♀️ Shared Worker로 클라이언트의 소켓 통신 개선하기
- 👨👩👧👦 다중 탭에서 하나의 소켓을 공유할 수 있을까?
- 🚀 [Socket.io] 클라이언트의 실시간 채팅 구현기
- ☕ NestJS를 통한 일관적인 시스템 설계
✈️ 외부의 사용자가 Object Storage에 접근하지 못하는 권한 제어- 🦢 nestjs에서 swagger 사용해보기
- 🛐 NestJS Nginx Request Data Size 문제
- 🔁 다시보기를 위한 Node‐Media‐Server, FFMpeg 분석