[Javascript] 메일 발송 모듈과 스케쥴러 구상

정태호·2022년 11월 24일
0

휴면 유저에대한 안내 메일 발송과 개인정보 이용내역 알림 메일을 보내기 위한 스케쥴러와 발송 기능을 구현할 모듈의 제작하게 되었다.
AWS의 lambda를 사용하지 않고 서버 내부에서 함께 실행되는 모듈을 구현해야 한다.
이를 위해 대략적인 흐름도를 작성해 보았다.

scheduler

특정한 주기로 데이터를 조회하고 조건에 맞는 유저에게 안내메일을 발송할 수 있어야 한다.
이때 발송조건이 된는 항목은 휴면유저안내와 개인정보이용 안내 두가지 이지만 필요에 따라 다른 스케쥴러에 의한 주기적 조회가 필요한 기능들을 추가로 등록할 수 있도록 고려하려 구상해 보았다.

스케쥴러에는 두가지 함수를 등록하는 것으로 주기적인 함수 실행을 보장할 수있도록 할 예정이다.

1.[실행 예정 시간][실행시 발송할 정보를 반환]의 정보를 반환하는 함수와
2.[발송할 정보를 입력 받아 정합성 체크 후 sendModule를 호출]의 역할을 수행하는 함수

두가지 함수를 scheduler인스턴스에 insert 함수를 통해 등록하게 되면 첫 서버 실행시 등록된 함수 list의 1번 함수를 차례로 실행하고 반환 정보를 [우선순위 큐]에 차례로 insert한다.

이렇게 등록된 모든 함수가 실행된 후 setTimeout 생성함수를 호출한다. 해당 함수에서는 [우선순위 큐] 를 조회 하여 가장 빠른 조회 시간을 확인하고 큐의 정보를 pop하여 2번 함수를 실행하는 함수를 setTimeout으로 등록한다.

sendModule

func: 발송 정보 삽입 함수
해당 모듈은 외부로 발송정보 삽입 함수만을 제공한다.
이때 삽입함수로 들어온 정보는 해당 모듈에 등록되어있는 [전송api 함수,유효성확인 함수] list에서 유효성확인 함수를 통과한 정보에 대해 해당 api요구 포멧으로 가공하여 [발송정보 큐] 에 해당 api index번호와 함께 삽입한다.

func: 전송 api 순차 호출 함수
이후 해당 함수를 호출하게 되고 이 함수는 [발송정보 큐] 가 빌때까지 큐 정보를 참조하여 해당 api를 호출하여 발송요청을 반복 수행하게 된다.
이때 로직이 다른 이벤트 처리를 블록킹하는 것을 방지하기 위해 콜백 형태로 큐정보를 처리해 나간다.

동일한 api에 대해서 발송완료전 발송요청 방지를 위해 promise의 상태정보를 감시하는 것으로 pending 상태시 해당 요청을 [발송정보 큐] 에 다시 push 하고 다음 큐 정보를 처리하게 된다.

func: 실패 정보 핸드링 함수
해당 함수는 [발송정보 큐] 비게되면 실행되는 함수로 발송요청이 실패한 발송정보를 담고 있는 [발송 정보 실패 큐] 의 정보를 하나씩 핸들링한다.
발송요청이 반드시 성공해야 하는 정보와 특정 횟수의 재발송 정보가 기록된 발송정보를 다시 [발송정보 큐] 에 삽입해주는 역할을 수행한다.

.
.
.

위의 대략적인 흐름을 기반으로 책임을 분리하고 의존성을 고려하여 세부 구현을 해볼 생각이다.

0개의 댓글