Design Distributed Mail Service

μš”κ΅¬μ‚¬ν•­

  • κΈ°λŠ₯

    • 이메일 λ°œμ†‘/μˆ˜μ‹ 

    • λͺ¨λ“  이메일 쑰회

    • 읽음 μ—¬λΆ€ 필터링

    • 검색 κΈ°λŠ₯

    • 슀팸 및 λ°”μ΄λŸ¬μŠ€ λ°©μ§€ κΈ°λŠ₯

    • 첨뢀 파일 지원

    • SMTP / POP / IMAP λ“± ν”„λ‘œν† μ½œ 지원

  • 규λͺ¨

    • μ‚¬μš©μž 수: 10μ–΅ λͺ…

    • ν•˜λ£¨ 평균 전솑 이메일 건수: 10건

    • ν•˜λ£¨ 평균 μˆ˜μ‹  이메일 건수: 40건

    • 이메일 ν•˜λ‚˜μ˜ 평균 메타데이터 크기: 50KB

    • 첨뢀 파일 평균 크기: 500KB

    • 첨뢀 파일 포함 λΉ„μœ¨: 20%

  • μΆ”μ •

    • 이메일 전솑 QPS = 10μ–΅ λͺ… * 평균 10건 / 24μ‹œκ°„ / 3600초 = 115,740

    • 1λ…„ 메타데이터 μš©λŸ‰ = 10μ–΅ λͺ… * 평균 40건 * 365일 * 50KB = 730TB

    • 1λ…„ 첨뢀 파일 μš©λŸ‰ = 10μ–΅ λͺ… * 평균 40건 * 365일 * 500KB * 20% = 1,460PB

λ°°κ²½ 지식

이메일 ν”„λ‘œν† μ½œ

이메일을 μ£Όκ³ λ°›λŠ” ν”„λ‘œν† μ½œμ—λŠ” μ—¬λŸ¬ κ°€μ§€κ°€ μ‘΄μž¬ν•œλ‹€.

  • SMTP(Simple Mail Transfer Protocol): 이메일을 ν•œ μ„œλ²„μ—μ„œ λ‹€λ₯Έ μ„œλ²„λ‘œ λ³΄λ‚΄λŠ” ν‘œμ€€ ν”„λ‘œν† μ½œ

  • POP(Post Office Protocol): 이메일 ν΄λΌμ΄μ–ΈνŠΈκ°€ 원격 메일 μ„œλ²„μ—μ„œ 이메일을 μˆ˜μ‹ ν•˜κ³  λ‹€μš΄λ‘œλ“œν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” ν‘œμ€€ ν”„λ‘œν† μ½œ

    • λ‹¨λ§λ‘œ λ‹€μš΄λ‘œλ“œ 된 이메일은 μ„œλ²„μ—μ„œ μ‚­μ œλ˜μ–΄, ν•œ λŒ€ λ‹¨λ§μ—μ„œλ§Œ μˆ˜μ‹  κ°€λŠ₯

    • 이메일을 μΌλΆ€λ§Œ 읽을 수 μ—†μ–΄, μš©λŸ‰μ΄ 큰 첨뢀 파일이 첨뢀 된 경우 λ§Žμ€ μ‹œκ°„μ΄ μ†Œμš”λ¨

  • IMAP(Internet Message Access Protocol): 이메일 ν΄λΌμ΄μ–ΈνŠΈκ°€ 원격 메일 μ„œλ²„μ—μ„œ 이메일을 μˆ˜μ‹ ν•˜κ³  λ‹€μš΄λ‘œλ“œν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” ν‘œμ€€ ν”„λ‘œν† μ½œ

    • POP와 달리 메일 μ„œλ²„μ—μ„œ μ§€μ›Œμ§€μ§€ μ•Šμ•„ μ—¬λŸ¬ λŒ€μ˜ λ‹¨λ§μ—μ„œ 메일을 읽을 수 있음

    • λ©”μ‹œμ§€λ₯Ό μ—΄κΈ° μ „μ—” ν—€λ”λ§Œ λ‹€μš΄ λ°›κ³ , 전체 λ©”μ‹œμ§€λ₯Ό 읽을 λ•Œλ§Œ λ‹€μš΄λ‘œλ“œ

    • 개인 이메일 κ³„μ •μ—μ„œ κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” ν”„λ‘œν† μ½œ

  • HTTPS(HyperText Transfer Protocol Secure): 메일 전솑 ν”„λ‘œν† μ½œμ€ μ•„λ‹ˆλ©°, μ›Ή 기반 메일 μ‹œμŠ€ν…œ 접속에 μ‚¬μš©λ˜λŠ” ν”„λ‘œν† μ½œ

전톡적 메일 μ„œλ²„ λ™μž‘

전톡적 메일 μ„œλ²„μ˜ μ•„ν‚€ν…μ²˜λŠ” κ°„λ‹¨ν–ˆμœΌλ©°, 메일을 μ „μ†‘ν•˜λŠ” 과정을 λ‹€μŒκ³Ό 같이 μš”μ•½ν•  수 μžˆλ‹€.

  1. Aκ°€ 아웃룩 ν΄λΌμ΄μ–ΈνŠΈμ— 둜그인 ν›„ Bμ—κ²Œ 전솑

  2. ν•΄λ‹Ή 이메일은 아웃룩 SMTP 메일 μ„œλ²„λ‘œ 전솑(SMTP ν”„λ‘œν† μ½œ μ‚¬μš©)

  3. 아웃룩 μ„œλ²„λŠ” DNS 질의λ₯Ό 톡해 μˆ˜μ‹ μ‚¬ SMTP μ„œλ²„ μ£Όμ†Œ 쑰회

  4. μ•Œμ•„λ‚Έ μ£Όμ†Œμ˜ ν•΄λ‹Ή SMTP 메일 μ„œλ²„λ‘œ 이메일 전솑(SMTP ν”„λ‘œν† μ½œ μ‚¬μš©)

  5. μˆ˜μ‹ ν•œ 지메일 μ„œλ²„λŠ” 이메일을 μ €μž₯

  6. Bκ°€ λ‘œκ·ΈμΈν•œ 지메일 ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ IMAP/POP μ„œλ²„μ— 이메일 확인 μš”μ²­

  7. IMAP/POP μ„œλ²„λŠ” μ €μž₯된 이메일을 쑰회 ν›„ ν΄λΌμ΄μ–ΈνŠΈλ‘œ 전솑

이메일 μ €μž₯도 μ‹œμŠ€ν…œμ˜ 파일과 디렉터리λ₯Ό ν™œμš©ν•˜λŠ” κ°„λ‹¨ν•œ λ°©μ‹μœΌλ‘œ μ΄λ£¨μ–΄μ‘Œλ‹€.

home
    user1
        Maildir
            new
            cur
            tmp
            ...
            
    user2
        Maildir
            new
            cur
            tmp
            ...
                 
    ...

ν•˜μ§€λ§Œ 이 κ΅¬μ‘°λŠ” 수 μ‹­μ–΅ 개의 이메일을 κ²€μƒ‰ν•˜κ³  λ°±μ—…ν•˜λŠ” λͺ©μ μœΌλ‘œ ν™œμš©ν•˜κΈ°μ—” λ””μŠ€ν¬ I/Oκ°€ 병λͺ©μ΄ λ˜μ–΄ λΆ€μ μ ˆν•˜λ‹€. λ•Œλ¬Έμ— λ§Žμ€ μ‚¬μš©μžμ™€ λ§Žμ€ 데이터λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ ν˜„μž¬λŠ” λΆ„μ‚° 메일 μ„œλ²„ μ•„ν‚€ν…μ²˜λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€.

이메일 API

μ›Ή 메일 ν†΅μ‹ μ—λŠ” 일반적으둜 HTTP ν”„λ‘œν† μ½œμ΄ μ‚¬μš©λ˜λ©°, 핡심 APIλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  1. POST /message: To, Tc, Bcc 헀더에 λͺ…μ‹œλœ μˆ˜μ‹ μžμ—κ²Œ λ©”μ‹œμ§€ 전솑

  2. GET /folders: μ£Όμ–΄μ§„ 이메일 계정에 μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  폴더 λͺ©λ‘ λ°˜ν™˜

  3. GET /folders/{:folder_id}/message: μ£Όμ–΄μ§„ 폴더 μ•„λž˜ λͺ¨λ“  λ©”μ‹œμ§€ λ°˜ν™˜

  4. GET /message/{:message_id}: μ£Όμ–΄μ§„ νŠΉμ • λ©”μ‹œμ§€μ— λŒ€ν•œ λͺ¨λ“  정보 λ°˜ν™˜

λΆ„μ‚° 메일 μ„œλ²„ μ•„ν‚€ν…μ²˜

μ»΄ν¬λ„ŒνŠΈ

μ—¬λŸ¬ μ„œλ²„ 사이에 데이터 동기화와, μˆ˜μ‹ μž 메일 μ„œλ²„μ˜ 이메일 슀팸 ꡬ뢄 λ“± λ§Žμ€ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈλ‘œ κ΅¬μ„±λœ λΆ„μ‚° 메일 μ„œλ²„ μ•„ν‚€ν…μ²˜λ₯Ό μ‚¬μš©ν•œλ‹€.

      웹메일
    /       \
 https     μ›Ήμ†ŒμΌ“
  /           \
μ›Ή μ„œλ²„      μ‹€μ‹œκ°„ μ„œλ²„
  \           /
   \         /
    \       /
    μ €μž₯μ†Œ 계측
  • 웹메일: μ‚¬μš©μžκ°€ 메일을 λ°›κ³  λ³΄λ‚΄λŠ” μΈν„°νŽ˜μ΄μŠ€

  • μ›Ή μ„œλ²„: μ‚¬μš©μžκ°€ μ΄μš©ν•˜λŠ” μš”μ²­/응닡 μ„œλΉ„μŠ€λ‘œ, μ‚¬μš©μž 인증, 메일 전솑, 메일 μˆ˜μ‹  λ“±μ˜ λͺ¨λ“  이메일 APIλ₯Ό 처리

  • μ‹€μ‹œκ°„ μ„œλ²„: μƒˆλ‘œμš΄ 이메일 내역을 ν΄λΌμ΄μ–ΈνŠΈμ— μ‹€μ‹œκ°„μœΌλ‘œ 전달

  • μ €μž₯μ†Œ 계측

    • 메타데이터 λ°μ΄ν„°λ² μ΄μŠ€: 이메일 제λͺ© / λ³Έλ¬Έ / λ°œμ‹ μΈ / μˆ˜μ‹ μΈ λ“± 메타데이터 μ €μž₯

    • 첨뢀 파일 μ €μž₯μ†Œ: λŒ€μš©λŸ‰ νŒŒμΌμ„ μ €μž₯ν•˜λŠ” 데 μ ν•©ν•œ λ°μ΄ν„°λ² μ΄μŠ€ μ‚¬μš©(μ•„λ§ˆμ‘΄ S3)

    • λΆ„μ‚° μΊμ‹œ: 졜근 μˆ˜μ‹  이메일은 자주 읽을 κ°€λŠ₯성이 λ†’μ•„ λ©”λͺ¨λ¦¬μ— 캐싱(λ ˆλ””μŠ€)

    • 검색 μ €μž₯μ†Œ: 고속 ν…μŠ€νŠΈ 검색을 μ§€μ›ν•˜λŠ” μ—­ 인덱슀λ₯Ό 자료ꡬ쑰둜 ν•œ μ €μž₯μ†Œ μ‚¬μš©

이메일 전솑 절차

  1. μ‚¬μš©μžκ°€ μ›Ή 메일 ν™˜κ²½μ—μ„œ 메일 μž‘μ„± ν›„ 전솑

  2. μ›Ή μ„œλ²„μ— 전달 λ°›κΈ° μ „ λ‘œλ“œλ°ΈλŸ°μ„œμ—μ„œ 처리율 μ œν•œμ— 따라 μš”μ²­μ„ μ›Ή μ„œλ²„μ— 전달

  3. 전달 받은 메일에 λŒ€ν•΄ μ•„λž˜ λ™μž‘ μˆ˜ν–‰

    1. 크기 및 ν•œλ„ 같은 기본적인 이메일 검증

    2. 슀팸 여뢀와 λ°”μ΄λŸ¬μŠ€ 감염 μ—¬λΆ€ 검사

  4. 메일을 μ™ΈλΆ€ 전솑 큐둜 전달

    • μ²¨λΆ€νŒŒμΌμ΄ 큰 κ²½μš°μ—” 객체 μ €μž₯μ†Œμ— λ”°λ‘œ μ €μž₯ ν›„ μ°Έμ‘° μ •λ³΄λ§Œ 큐에 전달

  5. λ©”μ‹œμ§€ νμ—μ„œ μ™ΈλΆ€ 전솑 SMTP μ„œλ²„λ‘œ 전달

  6. μ™ΈλΆ€ 전솑 SMTP μ„œλ²„μ—μ„œλ„ 이메일 검증

  7. μˆ˜μ‹ μžμ˜ 메일 μ„œλ²„λ‘œ 메일 전솑

    • μ‹€νŒ¨ μ‹œ μ§€μˆ˜μ  λ°±μ˜€ν”„μ™€ 같은 μ „λž΅μœΌλ‘œ 메일 전솑 μž¬μ‹œλ„

이메일 μˆ˜μ‹  절차

  1. μ „μ†‘λœ 이메일이 λ‘œλ“œλ°ΈλŸ°μ„œμ— 도착

  2. μ—¬λŸ¬ SMTP μ„œλ²„λ‘œ 이메일 전달

  3. μˆ˜μ‹  이메일 큐둜 전달

    • μ²¨λΆ€νŒŒμΌμ΄ 큰 κ²½μš°μ—” 객체 μ €μž₯μ†Œμ— λ”°λ‘œ μ €μž₯ ν›„ μ°Έμ‘° μ •λ³΄λ§Œ 큐에 전달

  4. 메일 처리 μ„œλ²„λ‘œ 보낸 ν›„ 메일 검증

  5. κ²€μ¦λœ 이메일을 메일 μ €μž₯μ†Œ / μΊμ‹œ / 객체 μ €μž₯μ†Œ 등에 보관

  6. μˆ˜μ‹ μžκ°€ 온라인 μƒνƒœμΈ 경우 이메일을 μ‹€μ‹œκ°€ μ„œλ²„μΈ μ›Ή μ†ŒμΌ“ μ„œλ²„λ‘œ 전달

  7. μˆ˜μ‹ μžκ°€ μ˜€ν”„λΌμΈ μƒνƒœμΈ 경우 이메일을 μ €μž₯μ†Œ 계측에 μ €μž₯

상세 섀계

메타데이터 λ°μ΄ν„°λ² μ΄μŠ€

이메일 λ©”νƒ€λ°μ΄ν„°λŠ” λ‹€μŒκ³Ό 같은 νŠΉμ„±μ„ κ°€μ§„λ‹€.

  • 이메일 ν—€λ”λŠ” 일반적으둜 μž‘κ³  λΉˆλ²ˆν•˜κ²Œ 이용

  • 본문의 ν¬κΈ°λŠ” μž‘μ€ 것 λΆ€ν„° 큰 κ²ƒκΉŒμ§€ λ‹€μ–‘

  • 본문의 μ½κΈ°λŠ” 일반적으둜 ν•œ 번만 이루어짐

  • 이메일에 λŒ€ν•œ κΆŒν•œ 처리 ν•„μš”(νŠΉμ • μ‚¬μš©μžλ§Œ 읽을 수 μžˆλ„λ‘)

  • 보톡 졜근의 μ΄λ©”μΌλ§Œ 자주 읽음

  • 데이터 손싀이 λ°œμƒν•˜λ©΄ μ•ˆ 됨

μ΄λŸ¬ν•œ 데이터 νŠΉμ„±μ€ λ‹€μŒκ³Ό 같은 μš”κ΅¬ μ‚¬ν•­μœΌλ‘œ 정리할 수 μžˆλ‹€.

  • 단일 컬럼의 크기가 클 수 있음

  • λ””μŠ€ν¬ I/O μ΅œμ†Œν™”λ˜λ„λ‘ 섀계

  • κ°€μš©μ„±μ΄ λ†’κ³  μž₯μ•  감내가 κ°€λŠ₯ν•΄μ•Ό 함

  • 증뢄 백업이 κ°€λŠ₯ν•΄μ•Ό 함

  • κ°•λ ₯ν•œ 데이터 일관성 보μž₯

μ΄λŸ¬ν•œ νŠΉμ„±μ„ κ³ λ €ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€μ˜ μž₯단점을 비ꡐ해보면 λ‹€μŒκ³Ό κ°™λ‹€.

  • RDBMS

    • 헀더와 본문에 λŒ€ν•œ 인덱슀λ₯Ό λ§Œλ“€μ–΄ κ°„λ‹¨ν•œ 질의λ₯Ό λΉ λ₯΄κ²Œ 처리 κ°€λŠ₯

    • 큰 이메일을 BLOB으둜 μ €μž₯ν•˜κ²Œ λ˜λŠ”λ°, κ·Έ 경우 처리 μ‹œκ°„μ΄ 길어짐

  • λΆ„μ‚° 객체 μ €μž₯μ†Œ

    • μ΄λ©”μΌμ˜ μ›μ‹œ 데이터 κ·ΈλŒ€λ‘œ 객체 μ €μž₯μ†Œμ— λ³΄κ΄€ν•˜μ—¬ 데이터 백업에 용이

    • 읽음 ν‘œμ‹œ / ν‚€μ›Œλ“œ 검색 λ“± κΈ°λŠ₯ κ΅¬ν˜„μ΄ 어렀움

  • NoSQL

    • 지메일이 ν•΄λ‹Ή 방법을 μ‚¬μš©ν•˜κ³  μžˆμœΌλ‚˜, κ΅¬ν˜„ 방법 μ•Œ 수 μ—†μŒ(μ˜€ν”ˆ μ†ŒμŠ€ X)

κΈ°λŠ₯을 μ™„λ²½ν•˜κ²Œ μ§€μ›ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€λŠ” μ—†λ‹€κ³  λ³Ό 수 있고, μ‹€μ œλ‘œ λŒ€ν˜• 이메일 μ„œλΉ„μŠ€ μ—…μ²΄λŠ” λ…μžμ μΈ λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ„ κ΅¬μΆ•ν•˜κ³  μžˆλ‹€.

검색

이메일 검색 κΈ°λŠ₯은 λ‹€μŒκ³Ό 같은 νŠΉμ„±μ„ κ°€μ§„λ‹€.

  • 검색 κΈ°λŠ₯ μ œκ³΅μ„ μœ„ν•΄ 이메일이 전솑/μˆ˜μ‹ /μ‚­μ œ 될 λ•Œ λ§ˆλ‹€ 인덱싱 μž‘μ—… μˆ˜ν–‰ ν•„μš”

  • λ°˜λ©΄μ— 검색은 μ‚¬μš©μžκ°€ 검색을 ν•  λ•Œλ§Œ μ‹€ν–‰λ˜λŠ”λ°, μ΄λŠ” λΉˆλ²ˆν•˜μ§€ μ•ŠμŒ

  • μ“°κΈ° 연산이 읽기 연산보닀 더 많이 λ°œμƒν•˜κ²Œ 됨

검색 κΈ°λŠ₯을 μ œκ³΅ν•˜κΈ° μœ„ν•΄ λ§žμΆ€ν˜• 검색 μ†”λ£¨μ…˜κ³Ό μ—˜λΌμŠ€ν‹±μ„œμΉ˜λ₯Ό μ΄μš©ν•˜λŠ” λ°©μ•ˆμ΄ μ‘΄μž¬ν•œλ‹€.

  1. μ—˜λΌμŠ€ν‹±μ„œμΉ˜

    • 처리 방법

      • 검색은 μ—˜λΌμŠ€ν‹±μ„œμΉ˜λ₯Ό μ΄μš©ν•˜μ—¬ λ™κΈ°μ μœΌλ‘œ μˆ˜ν–‰

      • 전솑/μˆ˜μ‹ /μ‚­μ œλŠ” 비동기식 ν˜ΈμΆœν•˜μ—¬ μ—˜λΌμŠ€ν‹± ν΄λŸ¬μŠ€ν„°μ— 반영

    • νŠΉμ§•

      • μ—˜λΌμŠ€ν‹±μ€ 검색에 μ΅œμ ν™”λ˜μ–΄ μžˆμ–΄, 검색 속도가 빠름

      • λΉ„λ™κΈ°μ μœΌλ‘œ μ²˜λ¦¬λ˜λŠ” μ—˜λΌμŠ€ν‹± ν΄λŸ¬μŠ€ν„°μ™€ μ£Ό 이메일저μž₯μ†Œμ™€ 데이터 동기화가 κΉŒλ‹€λ‘œμ›€

  2. λ§žμΆ€ν˜• 검색 μ†”λ£¨μ…˜

    • νŠΉμ§•

      • 인덱싱을 μ‚¬μš©ν•˜λŠ” 경우 λ‹€λŸ‰μ˜ μ“°κΈ° 연산에 λŒ€ν•œ ν•΄κ²°μ±… ν•„μš”

참고자료

Last updated

Was this helpful?