Show GN: 이메일 발송 시스템 오픈소스 (AWS SQS, SES, SNS 등을 활용한 Golang 프로젝트)
(github.com/lee-lou2)안녕하세요,
Golang 을 이용해서 구축한 이메일 발송 시스템을 소개합니다 🙇♂️
(참고로, 이 프로젝트는 AWS SES 에 맞춰 설계/개발 되었습니다)
- Github : https://github.com/lee-lou2/email-go
프로젝트 구조
-
Client
AWS SQS 를 이용해서 이메일 발송을 요청합니다.
큐를 직접 쌓거나 HTTP 요청 모두 사용가능합니다. -
Dispatcher
AWS Client 를 연결해서 SQS 의 큐를 컨슈밍합니다.
1개의 컨슈머로 메시지를 수집합니다.
수집된 메시지는 즉시 Sender 에게 전달합니다. -
Sender
전달 받은 메시지를 데이터베이스에 준비 상태로 저장합니다.
그리고 AWS SES 의 초당 발송 제한을 고려한 채널에 전달합니다.
이메일이 발송되거나 발송 실패하면 그 상태를 다시 상태 관리 채널로 전달합니다.
이 채널에선 1000개를 묶거나 10초 동안 묶인 결과를 일괄로 데이터베이스에 업데이트합니다.
(1개의 고루틴으로 메시지를 발송하고 결과를 업데이트 하기때문에 데이터 경합이 일어나지 않습니다)
AWS SES 초당 발송 제한이 있기 때문에 분산 설계를 하지 않아도 충분히 발송 속도를 유지할 수 있습니다
-
Results
AWS SNS 를 이용해서 SES 로 발송한 이메일의 발송 결과를 웹훅으로 서버로 전달합니다.
서버에선 결과를 저장합니다. -
Statistics
이메일 발송 요청 시 PlanID 라는 이메일 묶음 단위의 고유 값을 함께 전달합니다.
이 값을 이용해서 HTTP API 를 호출하면 해당 묶음의 발송 수, 실패 수, 중지 수 등 다양한 결과를 확인할 수 있습니다.
AWS SES 의 일별 발송량이 제한되어 있기 때문에 최근 24시간 동안 발송한 이메일 수를 조회하는 API 를 따로 추가하였습니다.
현재 AI 로 번역/요약하는 해커 뉴스 발송을 위 프로젝트로 진행하고 있습니다.
(https://news.hada.io/topic?id=18666)
충분히 안정적이며 최소한의 리소스로 발송되고 있습니다.
아직 보완해야할 부분이 많지만 이메일 발송 시스템이 구축되어있지 않은 곳이나 개인적으로 발송이 필요한 경우 충분한 해결책이 될 수 있다고 생각합니다.
AWS SES 나 SQS, SNS 를 설정하는 방법 등에 대해선 따로 작성해두지 않았습니다.
혹시 구축이 필요하신 분이 계시다면 아래 메일로 문의주시면 당연히 무료로 지원해드립니다.
개선이 필요한 부분에 대해선 적극적으로 제안 주시면 빠르게 반영하겠습니다 🙏
감사합니다 👏
- email : lee@lou2.kr
- linkedIn : linkedin.com/in/lou2
메일로 모니터링 리포트를 매일 발송합니다. 참고로 전 문과출신이다 보니 js나 python을 좀 다루는 정도입니다. 그래서 golang으로 개발하셨다고 하니 접근이 어려울것 같아서 겁부터 나는데요. 혹시 golang으로 하신 것은 성능이 가장 큰 이유인지 궁금합니다.
안녕하세요 🙇♂️ 아아 제가 고퍼입니다ㅋㅋ사실 AWS SES 의 경우 일일 한도량, 초당 발송 가능 수가 정해져있어서 아무리 성능이 좋아도 퍼포먼스를 내기엔 한계가있습니다 하지만 같은 속도라도 사용하는 리소스가 python 대비 훨씬 적게 들어서 golang 을 선택한 것도 있습니다
자세한 내용은 아래 README 를 참고해주세요 🎉
https://github.com/lee-lou2/email-go/blob/main/README.ko.md