랭킹 시스템 외부 서버의 필요성

서버 1대의 처리량 제한으로 인해, In-memory 방식으로 랭킹 시스템을 구현할 수 없었습니다. 초당 10,000의 데이터가 들어오 서버 1대당 처리량은 약 8,000 미만이기 때문입니다.

따라서 메모리를 공유할 수 있는 서버를 도입하여, 실시간 랭킹을 도입하기로 했습니다.

결과 요약

항목 Redis ZSET ClickHouse
TOP N 조회 속도 ~1,600ms ~68ms
저장 효율 (100만 건) ~100MB ~18MB
일일 랭킹 집계 메모리 한계로 불가 가능
반영 지연 즉시 2초 ~ 5초

Redis와 ClickHouse의 성능을 비교하였고 최종적으로 ClickHouse를 공유하는 방식으로 사용

1. 초기 구현

처리흐름

event 전송 : User -->  Server  -->  Redis 저장
랭킹 조회 : Redis  -->  Server  -->  User

왜 Key를 시간으로 하였는가?

Redis는 시간을 Key로 두어야 TTL이 지난 데이터를 빠르게 삭제할 수 있다. 그 이유는 Redis가 key를 기준으로 빠르게 읽기 때문이다.

랭킹 시스템이므로, ZSET을 사용하고 있다. 하지만 member에 시간 값을 두게 될 경우, Redis를 TTL 삭제를 하기 위해서 Key → member로 들어가서 확인을 해야한다.(비효율적) 그리고 무엇보다도 애초에 member 기준 TTL을 지원하지 않는다.