본문으로 건너뛰기

채팅 API: 서버를 늘리면 용량이 그대로 늘어나는 채팅 엔진

채팅은 붙이기는 쉽고 제대로 하기는 어렵습니다. 메시지 순서가 뒤섞이지 않고, 연결이 끊겼다 붙어도 빠지는 메시지가 없어야 합니다. 세 서비스가 같은 엔진을 쓰도록 분리한 뒤, 그 엔진을 누구나 무료로 쓸 수 있게 열었습니다.

chat.gravex.app ↗ 2026-10-25 작성

  • Go
  • TypeScript
  • PostgreSQL
  • Redis
  • WebSocket

01무슨 문제였나

채팅은 붙이기는 쉽지만 순서 보장, 재연결, 중복 제거, 유실 복구를 제대로 하려면 손이 많이 갑니다. 코인충, 여기얼마, 에브리메이플이 각자 풀 문제가 아니어서 엔진 하나로 분리했고, 지금은 가입만 하면 누구나 무료로 쓸 수 있습니다.

02어떻게 만들었나

서버는 Go 프로그램 하나입니다. 저장은 PostgreSQL이 맡고, 여러 서버에 메시지를 나눠 보내는 일은 Redis가 맡습니다. 방마다 메시지에 빈틈없는 순번을 붙여서, 클라이언트가 빠진 번호를 알아채고 스스로 채웁니다.

클라이언트 SDK는 다른 라이브러리에 의존하지 않는 TypeScript 하나입니다. 서비스마다 앱을 따로 두는 구조라 서버 한 대를 여럿이 나눠 씁니다. 같은 메시지가 두 번 전달돼도 한 번만 저장되고, 저장 전에 서비스가 내용을 검사해 막을 수도 있습니다.

03서버를 늘리면 어떻게 되나

서버를 1대, 2대, 3대로 늘리며 같은 시험을 했습니다. 메시지를 이용자에게 내려보내는 처리량이 정확히 1배, 2배, 3배로 늘어, 서버를 한 대 더하면 같은 용량이 그대로 더해졌습니다.

반대로 메시지를 저장하는 쪽은 데이터베이스 하나를 거치므로 그쪽이 먼저 한계가 됩니다. 이 한계와 아직 재지 못한 것까지 공개 문서에 적었습니다. 쓰던 데이터를 통째로 내려받는 내보내기 기능도 있어서 서비스에 묶이지 않습니다.

04배운 점

연결 두 개가 겹치는 순간에만 생기는 버그는 가짜 환경으로는 재현되지 않았습니다. 그래서 진짜 데이터베이스와 서버를 띄워 테스트합니다. 숫자를 공개할 때는 얼마나 나오는지보다 어떤 조건에서 쟀는지가 더 중요했습니다. 또 이미 배포된 SDK는 회수할 수 없어서, 통신 규칙은 추가만 하고 지우지 않습니다.

함께 읽으면 좋은 글: 코인충,gocore

이렇게 만들고 운영하는 방식 그대로, 고객님의 서비스를 만들어 넘겨드립니다.

1~2개월 동안 실제로 운영되는 서비스를 함께 만들고, 그 뒤에는 AI로 직접 고치고 키울 수 있게 넘겨드립니다.

서비스 구축 알아보기 →