TIL

8장 분산 이메일 서비스

1단계: 문제 이해 및 설계 범위 확정

2단계: 개략적 설계안 제시 및 동의 구하기

이메일 프로토콜

DNS

Non-authoritative answer:
gmail.com	mail exchanger = 30 alt3.gmail-smtp-in.l.google.com.
gmail.com	mail exchanger = 10 alt1.gmail-smtp-in.l.google.com.
gmail.com	mail exchanger = 40 alt4.gmail-smtp-in.l.google.com.
gmail.com	mail exchanger = 5 gmail-smtp-in.l.google.com.
gmail.com	mail exchanger = 20 alt2.gmail-smtp-in.l.google.com.

첨부파일

전통적 메일 서버

graph LR
	A[A 사용자] --> OC[아웃룩 클라이언트]
	OC -->|1전송| S[SMTP서버]
	subgraph outlook 메일 서버
		S[SMTP서버]
		S --> ST[(저장소)]
		IP[IMAP/POP서버] --> ST
	end
	
	B[B 사용자] --> GC[지메일 클라이언트]
	GC -->|4가져오기| IM[IMAP/POP 서버]
	
  subgraph gmail 메일 서버
	  IM[IMAP/POP 서버] --> T[(저장소)]
		SP[SMTP 서버] -->|3저장| T
		S -->|2전송| SP
	end

  1. A는 outlook 클라이언트에 로그인하여 이메일을 작성하고 이메일을 보내면 outlook 메일 서버로 전송되는데 이 때 SMTP 프로토콜을 사용한다.
  2. outlook 메일 서버는 DNS 질의를 통해 수신사 SMTP 서버 주소를 찾고 (지메일) 해당 메일 서버로 이메일을 보낸다. (SMTP 사용)
  3. 지메일 서버는 이메일을 저장하고 수신자인 B가 읽어갈 수 있도록 한다.
  4. B가 지메일에 로그인하면 지메일 클라이언트는 IMAP/POP 서버를 통해 새 이메일을 가져온다.

분산 메일 서버 아키텍처

graph TD
  webmail[웹메일]
  webmail -->|https| wsv[웹서버]
  webmail -->|웹소켓| rtsv[실시간 서버]
  
  subgraph dblayer[저장소 계층]
	  mtdb[(메타데이터 DB)]
	  atdb[(첨부 파일 저장소)]
	  dtca[(분산 캐시)]
	  srh[(검색 저장소)]
  end
  
  wsv --> dblayer
  rtsv --> dblayer

이메일 전송 절차

graph TD
  webmail[웹메일]
  webmail -->|1 https| lb[로드밸런서]
  lb -->|2| ws[웹서버]
  ws -->|4 검증 통과 메일 전달| mq[[메시지 큐]]
  ws -->|검증 실패 메일 전달| eq[[에러 큐]]
  mq -->|5| smtp[외부 전송 SMTP]
  smtp -->|7| internet[인터넷]
  
  subgraph dblayer[저장소 계층]
	  mtdb[(메타데이터 DB)]
	  atdb[(첨부 파일 저장소)]
	  dtca[(분산 캐시)]
	  srh[(검색 저장소)]
  end
  
  ws -->|3| dblayer
  smtp -->|6| dblayer
  1. 사용자가 웹메일 환경에서 메일을 작성한 후 전송하면 요청은 로드밸런서로 전송된다.
  2. 로드밸런서는 처리율 제한 한도를 넘지 않는 선에서 요청을 웹 서버로 전달한다.
  3. 웹 서버는 기본적인 이메일 검증, 도메인 검사를 수행한다.
  4. 검증을 통과한 이메일은 외부 전송 메시지 큐로 전달되고 너무 큰 첨부 파일의 경우 객체 저장소에 따로 저장하고 큐에는 참조만 보관한다.
  5. 외부 전송 담당 SMTP 작업 프로세스는 메시지 큐에서 메시지를 꺼내 이메일 스팸 및 바이러스 감염 여부를 확인한다.
  6. 검증을 통과한 이메일은 저장소 계층 내의 ‘보낸 편지함’에 저장된다.
  7. 외부 전송 담당 SMTP 작업 프로세스가 수신자의 메일 서버로 메일을 전송한다.

이메일 수신 절차

graph TD
	mail[이메일] -->|1| lb[로드밸런서]
	lb -->|2| smtp[SMTP 서버]
	smtp -->|4| mq[[수신 이메일 큐]]
	mq -->|5| mp[메일 처리]
	mp -->|7| rs[실시간 서버]
	rs <-->|8 웹소켓| wm[웹메일]
	wm -->|9 https| ws[웹 서버]
	  
  subgraph dblayer[저장소 계층]
	  mtdb[(메타데이터 DB)]
	  atdb[(첨부 파일 저장소)]
	  dtca[(분산 캐시)]
	  srh[(검색 저장소)]
  end
  
  smtp -->|3| dblayer
  mp -->|6| dblayer
  ws -->|10| dblayer
  1. 이메일이 SMTP 로드밸런서에 도착한다.
  2. 로드밸런서는 트래픽을 여러 SMTP 서버로 분산한다.
  3. 이메일의 첨부 파일 큐에 들어가기 너무 크다면 S3에 보관한다.
  4. 이메일을 수신 이메일 큐에 넣는다.
  5. 메일 처리 작업 프로세스(worker)는 스팸 메일을 필터링하고 바이러스를 차단한다.
  6. 검증 통과 이메일을 메일 저장소, 캐시, 객체 저장소 등에 보관한다.
  7. 수신자가 온라인 상태라면 이메일을 실시간 서버로 전달한다.
  8. 실시간 서버는 웹소켓 서버로 수신자 클라이언트가 실시간으로 메일을 받게 한다.
  9. 오프라인 상태 사용자의 이메일은 저장소 계층에 보관하고 사용자가 온라인 상태가 되면 REST API로 메일을 조회한다.
  10. 웹 서버는 새로운 이메일 저장소 계층에서 가져와 클라이언트에 반환한다.

3단계: 상세 설계

메타데이터 데이터베이스

이메일 전송 가능성

검색

graph TD
	src[검색] -->|동기식 호출| api[RESTful API]
	snd[이메일 전송] -->|비동기식 호출| kfk[[카프카]]
	rcv[이메일 수신] -->|비동기식 호출| kfk
	del[이메일 삭제] -->|비동기식 호출| kfk
	kfk --> api
	api --> el[일래스틱서치 클러스터]

규모 확장성 및 가용성