문제
게임을 운영하다 보면 전체 유저에게 우편을 보내야 할 일이 많습니다. 점검 보상, 이벤트 보상, 긴급 공지 등. 가장 직관적인 방법은 모든 유저의 우편함에 하나씩 복사하는 것입니다. 하지만 제가 운영하는 서비스의 경우, 누적 유저 90만 명, MAU 10만 명 규모에서 전체 우편 하나 보낼 때마다 90만 번의 DB Write를 발생시키는 건 미친 짓입니다. 비용도 비용이지만, 그 중 대부분은 접속조차 하지 않는 유저입니다.
아이디어: 공통 우편함을 분리하자
핵심 아이디어는 간단합니다. 우편함을 두 종류로 나누는 것입니다.
- 개인 우편함(MailBox): 유저별로 존재하는 기존 우편함. 1:1 우편이 저장됩니다.
- 공통 우편함(CommonMailBox): 전체 우편만 모아둔 단일 저장소. 유저별로 존재하지 않습니다.
전체 우편을 보낼 때, 서버는 공통 우편함에 딱 한 번만 Write합니다. 유저 수와 무관하게 Write는 1회로 끝납니다. 클라이언트가 공통 우편함에 요청을 보내면, 아직 수신하지 않은 전체 우편을 자신의 개인 우편함으로 가져오는 구조입니다.
이렇게 로직을 구성했을 때의 장점은 Wrtie 비용의 감소( → ). 특히 Lazy한 전달의 특성 때문에 이탈률이 높거나 비활동 유저가 많은 게임의 경우 비용 절감 효과가 극대화됩니다.
다만 아래 사항들은 신경써야합니다.
- 카운터 등을 통한 중복 가져오기 방지 로직
- 공통 우편 만료 시스템 (클라이언트 시각 신뢰하면 안됨)
- 기타 우편 시스템(CS팀 서비스 등)과의 Race Condition 고려