문제

게임을 운영하다 보면 전체 유저에게 우편을 보내야 할 일이 많습니다. 점검 보상, 이벤트 보상, 긴급 공지 등. 가장 직관적인 방법은 모든 유저의 우편함에 하나씩 복사하는 것입니다. 하지만 제가 운영하는 서비스의 경우, 누적 유저 90만 명, MAU 10만 명 규모에서 전체 우편 하나 보낼 때마다 90만 번의 DB Write를 발생시키는 건 미친 짓입니다. 비용도 비용이지만, 그 중 대부분은 접속조차 하지 않는 유저입니다.

아이디어: 공통 우편함을 분리하자

핵심 아이디어는 간단합니다. 우편함을 두 종류로 나누는 것입니다.

  • 개인 우편함(MailBox): 유저별로 존재하는 기존 우편함. 1:1 우편이 저장됩니다.
  • 공통 우편함(CommonMailBox): 전체 우편만 모아둔 단일 저장소. 유저별로 존재하지 않습니다.

전체 우편을 보낼 때, 서버는 공통 우편함에 딱 한 번만 Write합니다. 유저 수와 무관하게 Write는 1회로 끝납니다. 클라이언트가 공통 우편함에 요청을 보내면, 아직 수신하지 않은 전체 우편을 자신의 개인 우편함으로 가져오는 구조입니다.

이렇게 로직을 구성했을 때의 장점은 Wrtie 비용의 감소( ). 특히 Lazy한 전달의 특성 때문에 이탈률이 높거나 비활동 유저가 많은 게임의 경우 비용 절감 효과가 극대화됩니다.

다만 아래 사항들은 신경써야합니다.

  • 카운터 등을 통한 중복 가져오기 방지 로직
  • 공통 우편 만료 시스템 (클라이언트 시각 신뢰하면 안됨)
  • 기타 우편 시스템(CS팀 서비스 등)과의 Race Condition 고려