배경
- 체험단 모집 기능에서는 모집 시작/종료 시점에 따른 상태 변경이 중요한 요구사항이었다.
- 초기에는 스케줄러, 스프링 이벤트, Redis TTL, Redis Keyspace Notifications, Kafka 등 다양한 기술을 고려했다.
- 요구사항을 충족하면서 성능 최적화와 실시간성을 모두 보장할 수 있는 기술을 선택하는 것이 핵심 과제였다.
고려사항과 장단점
1. 스케줄러 (Spring Scheduler)
- 장점:
- 간단한 구현과 직관적인 작업 흐름.
- Spring만으로 구현 가능하며 추가적인 인프라 필요 없음.
- 단점:
- 짧은 주기로 실행하면 DB 부하 증가.
- 긴 주기로 실행하면 실시간성 저하 발생.
- 동적으로 작업을 추가/제거하는 데 제약 존재.
2. 스프링 이벤트 (Spring Event)
- 장점:
- 비동기로 이벤트를 처리하므로 작업 간 결합도 감소.
- Spring 생태계 내에서 쉽게 확장 가능.
- 단점:
- 이벤트 발행 시점에 따라 작업 지연이 발생할 수 있음.
- 상태 변경을 위한 작업이 많아질 경우 이벤트 관리가 복잡해질 가능성.
3. Redis TTL (Time-To-Live)
- 장점:
- TTL 기능을 통해 자동으로 키 만료 시점 관리 가능.
- 모집 상태 변경을 Redis에서 직접 처리하므로 DB 조회 부하 감소.
- Polling과 결합하여 TTL 만료 처리의 누락 방지 가능.
- 단점:
- Redis 의존성 추가.
- TTL 만료 이후 처리 로직 구현 필요.
4. Redis Keyspace Notifications
- 장점:
- Redis의 이벤트 구독 기능을 활용해 실시간 키 만료 알림 제공.
- Polling 없이도 TTL 만료를 바로 처리 가능.
- 단점:
- 단일 서비스 내에서 Keyspace Notifications를 사용하는 것은 과도한 의존성을 초래할 수 있음.
- Redis 설정이 복잡해지고, 성능에 영향을 미칠 가능성 존재.
5. Kafka
- 장점:
- 대규모 분산 시스템에서 이벤트 처리에 최적화.
- 이벤트 기반 구조로 확장 가능성 보장.
- 단점:
- 단일 서비스 내 모집 상태 변경 작업에는 과도한 기술 도입.
- 메시지 지연 및 복잡성 증가 가능.최종 결정 및 구현