일을 하면서 항상 같은 기능이라도 대규모 트래픽이 발생 하거나 동시성 이슈가 발생하는 등 복잡한 상황에서는 어떻게 처리해야할 지 고민하고 싶은 니즈가 있었습니다. 이에 따라 순전히 학습만을 위한 Toy 게시판 프로젝트를 진행하면서 평소 하고싶었던 고민들을 하며 기술적으로 성장해보고 싶어 프로젝트를 시작하게 되었습니다. 약 1,200만 건의 게시글 데이터를 기준으로 분산시스템 환경에서 최대한 효율성을 고려해 기능을 구현해보려고 노력했습니다.
백엔드 학습이 목표이므로 화면 개발은 과감히 배제하였으며, 로그인 기능도 배제하여 아래 핵심 기능만 개발 진행하였습니다.
- 게시글 CRUD
- 댓글 CRUD
- 좋아요
- 조회수
- 인기글
게시판 서비스 특성 상, 읽기 트래픽이 쓰기 트래픽에 비해 상당히 높은 경향이 있습니다. 따라서 CQRS 패턴을 서비스, DB레벨에 적용하여 부하를 분산시켰습니다. 이 때 Kafka를 활용하여 쓰기 영역 서비스들과 읽기 영역 서비스들의 결합도를 낮추어, 각 영역에 장애가 발생했을 때 전파되지 않도록 하였습니다.
성능이 중요한 기능들은 Redis에 비정규화하여 저장해놓고 캐싱을 적극 활용하고자 했습니다. 각 서비스마다 서버를 할당하면 비용이 만만치 않으므로, 서비스마다 별도의 애플리케이션 및 DB를 할당하여 진행하였습니다.
- 각 도메인의 특성에 따른 DB 및 비즈니스 로직 설계
- 캐싱한 게시글 조회 데이터의 캐시 만료 타이밍에 대한 동시성 이슈
- Covering Index를 활용해 게시판 목록 조회 쿼리 효율 20배 개선
- 분산 Lock을 활용한 조회수 어뷰징 문제
- 분산 시스템 간 트랜잭션 통합 문제