서버 1대의 처리량 제한으로 인해, In-memory 방식으로 랭킹 시스템을 구현할 수 없었습니다. 초당 10,000의 데이터가 들어오 서버 1대당 처리량은 약 8,000 미만이기 때문입니다.
따라서 메모리를 공유할 수 있는 서버를 도입하여, 실시간 랭킹을 도입하기로 했습니다.
| 항목 | Redis ZSET | ClickHouse |
|---|---|---|
| TOP N 조회 속도 | ~1,600ms | ~68ms |
| 저장 효율 (100만 건) | ~100MB | ~18MB |
| 일일 랭킹 집계 | 메모리 한계로 불가 | 가능 |
| 반영 지연 | 즉시 | 2초 ~ 5초 |
Redis와 ClickHouse의 성능을 비교하였고 최종적으로 ClickHouse를 공유하는 방식으로 사용
처리흐름
event 전송 : User --> Server --> Redis 저장
랭킹 조회 : Redis --> Server --> User
Redis는 시간을 Key로 두어야 TTL이 지난 데이터를 빠르게 삭제할 수 있다. 그 이유는 Redis가 key를 기준으로 빠르게 읽기 때문이다.
랭킹 시스템이므로, ZSET을 사용하고 있다. 하지만 member에 시간 값을 두게 될 경우, Redis를 TTL 삭제를 하기 위해서 Key → member로 들어가서 확인을 해야한다.(비효율적) 그리고 무엇보다도 애초에 member 기준 TTL을 지원하지 않는다.