Skip to content

[BE-196] feat: Transactional Outbox Pattern을 이용해 주차권 결과 이메일을 신뢰성있게 준실시간으로 발송되도록 로직 개선 #402

Open
@Kwon770

Description

@Kwon770

AS-IS

이벤트 개최 실패로 서버 성능에 영향을 미칠 수 있는 로직은 전부 사후 처리하도록 로직을 변경하였습니다. 따라서 신청이 완료되자마자 실시간으로 주차권 신청 결과를 발송하던 초기 정책에서 이벤트가 끝나는 시점(ExpiredEvent raised)에 일괄적으로 주차권 신청 결과를 발송하도록 변경되었습니다.


문제점

  1. 개발팀 <-> 학생회(클라이언트) <-> 학생(유저) 간의 소통이 원활하지 못해 이벤트 종료 시점에 메일이 일괄 전송되도록 변경된 정책이 공유되지 못하였고, 학생들에게 혼란이 발생하였습니다.
  2. 이벤트 종료라는 고정된 시점에 이메일이 발생되도록 개발한 것과 달리, 학생회는 유동적으로 일처리가 되기를 원합니다. 신청이 마무리되면 속히 결과를 확정하고 이메일 발송, 공지되기를 원하지만, 고정된 시간에 이메일이 발송되도록 스케줄링 된 배치를 런타임에 변경할 수 없습니다.

개선 이유

어플리케이션이 안정화되고 인프라 스케일링이 도입되어 서비스가 안정화되었습니다. 선착순 신청이 개최되어 트래픽이 몰린 당시 어플리케이션을 모니터링한 결과 준실시간으로 이메일이 발송되도록 로직을 변경해도 서비스에 문제가 없을 것으로 예상됩니다.


TO-BE

Transactional Outbox Pattern을 활용합니다.

  1. 이벤트가 시작되는 시점(EventIssuedEvent)에 이메일 전송 배치를 실행한다.

2-1. 신청을 마무리하고 데이터를 저장하는 UserReflectionEvent가 EmailOutboxTable에 데이터를 저장한다.
2-2. 이메일 전송 배치가 1분 마다 EmailOutboxTable로부터 14건 씩 폴링해 메일은 전송하고, 전송 성공을 테이블에 기록한다.


체크리스트

  • assignee 설정 (선택)
  • labels 설정
  • milestone 설정
  • production DB Schema 반영

Metadata

Metadata

Assignees

Labels

성능개선성능 개선 관련 작업기능새로운 기능 추가, 가벼운 수정리팩터링코드 퀄리티 개선을 위한 작업

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions