티스토리 뷰
새로 합류한 회사에서 메시징 관련 기능을 구현할 일들이 생겼다.
요구사항을 간단히 정리하면 다음과 같다.
1. BATCH/EVENT 단위로 메시징 처리 필요
2. 메시징은 알림톡/슬랙/이메일을 대상으로 함
3. 메시지 내용은 주로 차트 정보 혹은 도메인 이벤트들을 대상으로 함
4. 수신자가 다양할 수 있고, 개인 별로 설정이 가능함
이에 대해 설계하고 구현한 것은 간략히 정리하면 다음과 같다.
메시징 Profile
- 각 사용자는 자신이 구독할 정보 종류, 매체 종류와 수신 시간을 설정할 수 있음
- 사용자 테이블을 FK 로 갖는 ReportProfile 테이블을 생성해둠
BATCH 성 메시징
- 최소한 한 명 이상의 사용자가 구독한 정보들에 대해 데이터 생성(polars)
- 생성된 데이터를 최소한의 단위로 Redis 에 저장(구독 정보에 따라 병합할 수 있도록)
- 메시지 수신자가 구독한 정보들을 선택하여 파편화된 메시지를 사용자 별로 병합
- 템플릿 가공후 매체별, 시간별로 실제 Export
- 이때 매체별 내용의 크기 제한 등이 존재하므로 병합된 메시지를 분할하여 전송하는 로직 구현
- 이 모든 과정을 Daily Batch 중에 실행시킴
EVENT 성 메시징
- DDD 를 사용중에 있으므로, 공유 도메인에 이벤트 객체를 활용
- 실제 메시지를 발생시켜야 하는 케이스들에 대해 MessageEvent class 를 상속하는 구체적인 MessageEvent Class 들을 정의
- 구체 MessageEvent 단위로 컨텐츠 생성을 자동화 (string.Template + Context)
- title, content, to 만을 MessageEvent 에 저장
- MessageEvent 를 기준으로 handler 를 등록하여 처리
- 각 도메인의 Application 단에서는 event_dispatcher 에 대해 앞서 설명한 구체적인 MessageEvent class 에 context 를 채워 dispatch
- 결과적으로 각 도메인에서는 발송 로직에 신경쓰지 않고 context 에만 집중하여 쉽게 export 가능하도록 설정함
재시도 로직
- EXPORT 하기 직전, 원본의 내용(내용, 수신자) + 발송 상태에 대해 DB 에 2주간 저장.
- 필요시 재전송 할 수 있도록 함
- event_id, content_hash 로 duplicate 방지
'연습' 카테고리의 다른 글
| Batch 메시징 설계기 (2) | 2025.11.16 |
|---|---|
| inspect.signature 를 사용한 안전한 동적 import 확장하기 (0) | 2025.10.26 |
| 기술 스택 정리 (0) | 2025.02.26 |
| Python requests와 HTTP Streaming 문제 해결 (0) | 2025.02.11 |
| Python ContextManager (with~) (2) | 2024.12.27 |
- Total
- Today
- Yesterday
- Javascript
- 프로그래머스
- 스택
- 불필요한 값 무시하기
- vscode
- requests
- BOJ
- 백준
- 이것도모르면바보
- 코딩테스트
- 그리디
- kafka쓰고싶어요
- jwt
- 위상정렬
- 삽질
- PREFECT
- django testcase
- cipher suite
- Til
- 힙
- SSL
- Python
- 우선순위큐
- endl을절대쓰지마
- 회고
- docker-compose update
- 최대한 간략화하기
- 파이썬
- Remote
- SQL
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |