메시지 하나를 보내면 채널 인원 수만큼 전달이 생깁니다. 이것을 팬아웃이라고 합니다. 채널이 최대 5만 명 이므로 한 번의 전송이 5만 개의 전달로 늘어납니다.
방식은 두 갈래이고, 쓰기와 읽기 중 어디에 비용을 낼지의 선택입니다.
두 방식의 대가
| 항목 | 보낼 때 복제 | 읽을 때 모으기 |
|---|---|---|
| 쓰기 | 수신자 수만큼 늘어난다 | 한 번 |
| 읽기 | 자기 받은함만 읽는다. 빠르다 | 채널에서 모아야 한다. 느리다 |
| 저장 | 같은 메시지가 N개 | 한 개 |
| 터지는 지점 | 큰 채널의 쓰기 증폭 | 많은 채널을 보는 사용자의 읽기 증폭 |
왜 하나로 통일하지 않나
평균 채널이 12명 이라 대부분은 복제해도 부담이 없습니다. 12개의 받은함에 쓰는 것은 아무 문제가 아니고, 읽기가 빨라지는 이득만 얻습니다.
문제는 소수의 큰 채널입니다. 5만 명 짜리 채널에 메시지 하나가 오면 5만 번의 쓰기가 발생하고, 그 채널이 활발하면 쓰기가 시스템을 밀어버립니다.
그래서 인원 수를 보고 경로를 고릅니다. 작은 채널은 복제하고, 큰 채널은 채널에만 저장해 읽을 때 모읍니다. 사용자 화면에서는 두 결과를 합쳐 보여줍니다.
경계값은 재서 정한다
몇 명부터 큰 채널로 볼지는 추측하지 않습니다. 채널 크기 분포와 채널별 메시지 빈도를 재서 쓰기 증폭이 감당 한계를 넘는 지점을 찾습니다. 인원이 많아도 조용한 채널은 복제해도 되고, 인원이 적어도 초당 수십 건이 오가면 부담이 됩니다.
오프라인 사용자는 다르게 다룬다
접속하지 않은 사용자에게 실시간 전달은 의미가 없습니다. 그 사람 몫의 팬아웃은 미룰 수 있습니다. 접속할 때 못 받은 메시지를 채널에서 가져오면 되고, 알림만 따로 보냅니다.
이렇게 나누면 20만 동시 접속자 몫만 실시간 경로를 타므로 팬아웃 폭이 크게 줄어듭니다.