Skip to content

소켓 서버와 api 서버 분리

ez edited this page Dec 3, 2024 · 2 revisions

소켓 서버와 api 서버 분리

저희 OctoDocs 팀은 실시간 통신을 위한 socket 서버와 HTTP 통신을 위한 RESTful API 서버를 함께 사용하고 있습니다.

실시간으로 노드, 페이지 정보를 수정할 때는 socket 서버를 사용하고 인증 및 워크 스페이스 정보를 수정할 때는 RESTful API를 사용하고 있습니다.

처음에는 아래처럼 nest 서버 하나에서 포트를 분리하여 websocket 서버와 REST API 서버를 함께 사용했습니다. image

하지만 하나의 nest 서버를 사용하면서 불편함을 느꼈고 저희는 아래와 같이 socket 서버와 API 서버를 분리하기로 결정했습니다. image

프로젝트 핵심 로직

우선 저희 프로젝트의 핵심적인 3가지 기능에 대해 설명드리겠습니다.

1. 실시간으로 문서 변경 사항 감지해서 redis에 저장

2. RESTful API CRUD 기능

3. 주기적으로 redis에 저장된 값을 postgres에 갱신

위 3가지 기능 중 가장 중요한 부분은 1번이고 대부분의 트래픽이 1번에서 발생합니다.

지금까지는 위 3가지 기능이 모두 하나의 nest 서버에 존재했습니다.

서버가 한 개일 때 문제점

1. 한 기능에 문제가 생기면 모든 기능에 영향을 준다.

nest 서버가 한 개일 때 가장 큰 문제점은 위 3가지 기능 중 하나라도 문제가 발생하면 3가지 기능 모두 영향을 받는다는 점입니다.

예를 들어 저 3가지 기능 중 3번 기능은 문제가 생기더라도 당장 사용자의 서비스 사용에 영향을 주지 않습니다.

하지만 3가지 기능이 모두 같은 서버에 존재하기 때문에 3번 기능에서 에러가 발생하면 서버가 죽어버리고 모든 기능이 동작하지 않게 됩니다. image

하지만 서버를 분리한다면 한 가지 기능에 문제가 생기더라도 다른 기능에 영향을 주지 않습니다. image

2. socket 서버와 API 서버는 독립적으로 동작한다.

저희 프로젝트에서 socket 서버와 API 서버는 서로 독립적으로 동작합니다.

socket 서버는 변경된 데이터를 받아 redis에 저장하고 postgres 데이터베이스를 사용하지 않습니다. (물론 아예 사용하지 않는 것은 아닙니다.)

postgres 데이터베이스를 사용하는 서버는 API 서버입니다.

socket 서버와 API 서버의 책임이 명확하기 때문에 서로 독립적인 서버로 분리하는 편이 개발에 있어서 더욱 편리할 것이라고 생각했습니다.

서버 분리

위 두 가지 이유 때문에 저희는 서버를 분리하기로 결정했습니다.

제대로 분리하기 위해서는 3가지 기능을 모두 별도로 분리하는 편이 좋겠지만 오버 엔지니어링이라고 판단하여 socket 서버와 API 서버만 분리하고 주기적 갱신 기능은 API 서버에 넣기로 했습니다.

개발 문서

⚓️ 사용자 피드백과 버그 기록
👷🏻 기술적 도전
📖 위키와 학습정리
🚧 트러블슈팅

팀 문화

🧸 팀원 소개
⛺️ 그라운드 룰
🍞 커밋 컨벤션
🧈 이슈, PR 컨벤션
🥞 브랜치 전략

그룹 기록

📢 발표 자료
🌤️ 데일리 스크럼
📑 회의록
🏖️ 그룹 회고
🚸 멘토링 일지
Clone this wiki locally