Open
Description
AS-IS
이벤트 개최 실패로 서버 성능에 영향을 미칠 수 있는 로직은 전부 사후 처리하도록 로직을 변경하였습니다. 따라서 신청이 완료되자마자 실시간으로 주차권 신청 결과를 발송하던 초기 정책에서 이벤트가 끝나는 시점(ExpiredEvent raised)에 일괄적으로 주차권 신청 결과를 발송하도록 변경되었습니다.
문제점
- 개발팀 <-> 학생회(클라이언트) <-> 학생(유저) 간의 소통이 원활하지 못해 이벤트 종료 시점에 메일이 일괄 전송되도록 변경된 정책이 공유되지 못하였고, 학생들에게 혼란이 발생하였습니다.
- 이벤트 종료라는 고정된 시점에 이메일이 발생되도록 개발한 것과 달리, 학생회는 유동적으로 일처리가 되기를 원합니다. 신청이 마무리되면 속히 결과를 확정하고 이메일 발송, 공지되기를 원하지만, 고정된 시간에 이메일이 발송되도록 스케줄링 된 배치를 런타임에 변경할 수 없습니다.
개선 이유
어플리케이션이 안정화되고 인프라 스케일링이 도입되어 서비스가 안정화되었습니다. 선착순 신청이 개최되어 트래픽이 몰린 당시 어플리케이션을 모니터링한 결과 준실시간으로 이메일이 발송되도록 로직을 변경해도 서비스에 문제가 없을 것으로 예상됩니다.
TO-BE
Transactional Outbox Pattern을 활용합니다.
- 이벤트가 시작되는 시점(EventIssuedEvent)에 이메일 전송 배치를 실행한다.
2-1. 신청을 마무리하고 데이터를 저장하는 UserReflectionEvent가 EmailOutboxTable에 데이터를 저장한다.
2-2. 이메일 전송 배치가 1분 마다 EmailOutboxTable로부터 14건 씩 폴링해 메일은 전송하고, 전송 성공을 테이블에 기록한다.
체크리스트
-
assignee
설정 (선택) -
labels
설정 -
milestone
설정 - production DB Schema 반영