Design Notification System

μ•Œλ¦Ό μ‹œμŠ€ν…œμ€ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 정보λ₯Ό μ „λ‹¬ν•˜λŠ” μ‹œμŠ€ν…œμœΌλ‘œ, ν˜„λŒ€ μ„œλΉ„μŠ€μ—μ„œλŠ” μ€‘μš”ν•œ λΆ€λΆ„μœΌλ‘œ 자리 μž‘μ•˜λ‹€. μ•Œλ¦Ό μ‹œμŠ€ν…œμ€ λͺ¨λ°”일 ν‘Έμ‹œ μ•Œλ¦Ό / SMS λ©”μ‹œμ§€ / 이메일 μ„Έ κ°€μ§€λ‘œ λΆ„λ₯˜ν•΄λ³Ό 수 μžˆλ‹€.

μš”κ΅¬ 사항

  • ν‘Έμ‹œ μ•Œλ¦Ό / SMS λ©”μ‹œμ§€ / 이메일 μ•Œλ¦Ό 지원

  • κ°€λŠ₯ν•œ 빨리 μ „λ‹¬λ˜μ–΄μ•Ό ν•˜μ§€λ§Œ 높은 λΆ€ν•˜ μ‹œ μ•½κ°„μ˜ 지연은 λ¬΄λ°©ν•œ μ—°μ„± μ‹€μ‹œκ°„(soft realtime) μ‹œμŠ€ν…œ

  • iOS / android / μ›Ή λ“± λ‹€μ–‘ν•œ ν”Œλž«νΌ 지원

  • μ„œλ²„ μΈ‘ μŠ€μΌ€μ€„λ§κ³Ό ν΄λΌμ΄μ–ΈνŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ•Œλ¦Ό 생성

  • μ•Œλ¦Ό μˆ˜μ‹  κ±°λΆ€ κΈ°λŠ₯

  • ν•˜λ£¨ 1,000만 건의 ν‘Έμ‹œ μ•Œλ¦Ό / 100만 건의 SMS λ©”μ‹œμ§€ / 500만 건의 이메일 μ•Œλ¦Ό 전솑

μ•Œλ¦Ό μœ ν˜•λ³„ 지원 λ°©μ•ˆ

  • iOS ν‘Έμ‹œ μ•Œλ¦Ό / Android ν‘Έμ‹œ μ•Œλ¦Ό: iOS와 Android ν‘Έμ‹œ μ•Œλ¦Όμ€ 각각 APNS와 FCM을 μ‚¬μš©ν•œλ‹€.

    • μ•Œλ¦Ό 제곡자 -> APNS / FCM -> λ””λ°”μ΄μŠ€ 순으둜 μ „λ‹¬ν•˜κ²Œ λœλ‹€.

  • SMS λ©”μ‹œμ§€: 트윌리였 / λ„₯슀λͺ¨ 같은 제 3μ‚¬μ—…μžμ˜ μ„œλΉ„μŠ€λ₯Ό 많이 이용

  • 이메일: 고유 이메일 μ„œλ²„λ₯Ό ꡬ좕할 μˆ˜λ„ μžˆμ§€λ§Œ, μ•ˆμ •μ„±κ³Ό 데이터뢄석 μ„œλΉ„μŠ€λ₯Ό μœ„ν•΄ Sendgrid / Mailchimp 같은 μ„œλΉ„μŠ€λ„ 많이 이용

μ—°λ½μ²˜ 정보 μˆ˜μ§‘ 절차

μ•Œλ¦Όμ„ μ „μ†‘ν•˜κΈ° μœ„ν•΄μ„  λͺ¨λ°”일 단말 토큰 / μ „ν™”λ²ˆν˜Έ / 이메일 λ“±μ˜ 정보가 ν•„μš”ν•˜λ‹€. ν•΄λ‹Ή 정보λ₯Ό μˆ˜μ§‘ν•˜κΈ° μœ„ν•΄μ„œ μ‚¬μš©μžκ°€ 앱을 μ„€μΉ˜ν•˜κ±°λ‚˜ 계정을 λ“±λ‘ν•˜λ©΄ API μ„œλ²„μ—μ„œ ν•΄λ‹Ή 정보λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•œλ‹€.

μ•Œλ¦Ό 전솑 및 μˆ˜μ‹  절차

개랡적인 ν”Œλ‘œμš°λŠ” μ•Œλ¦Ό 생성 μ„œλΉ„μŠ€ -> μ•Œλ¦Ό μ‹œμŠ€ν…œ -> μ„œλ“œνŒŒν‹° μ„œλΉ„μŠ€ -> λ””λ°”μ΄μŠ€ 순으둜 전달될 수 μžˆλ‹€.

  • μ•Œλ¦Ό 생성 μ„œλΉ„μŠ€(μ—¬λŸ¬ 개일 수 있음): λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ ν˜•νƒœκ±°λ‚˜, 크둠작 λ“±λ“± μ•Œλ¦Όμ„ μƒμ„±ν•˜λŠ” μ„œλΉ„μŠ€

  • μ•Œλ¦Ό μ‹œμŠ€ν…œ: μ•Œλ¦Ό 생성 μ„œλΉ„μŠ€μ—μ„œ μƒμ„±λœ μ•Œλ¦Όμ„ λ°›μ•„μ„œ μ „μ†‘ν•˜λŠ” μ„œλΉ„μŠ€

  • μ„œλ“œνŒŒν‹° μ„œλΉ„μŠ€: μ•Œλ¦Όμ„ μ‹€μ œλ‘œ μ „λ‹¬ν•˜λŠ” 역할을 ν•˜λŠ” μ„œλΉ„μŠ€(APNS / FCM / 트윌리였 / λ„₯슀λͺ¨ / Sendgrid / Mailchimp λ“±)

  • λ””λ°”μ΄μŠ€: μ•Œλ¦Όμ„ λ°›λŠ” λ””λ°”μ΄μŠ€

μ—¬κΈ°μ„œ μ•Œλ¦Ό μ‹œμŠ€ν…œμ„ ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€λ‘œ κ΅¬ν˜„ν•  μˆ˜λ„ μžˆμ§€λ§Œ, μ•„λž˜μ˜ 이유둜 λΆ„λ¦¬ν•˜λŠ” 것이 μ’‹λ‹€.

  • SPOF(Single Point of Failure): μ•Œλ¦Ό μ‹œμŠ€ν…œμ΄ λ‹€μš΄λ˜λ©΄ μ•Œλ¦Ό 전솑 쀑단 κ°€λŠ₯μ„± 쑴재

  • μ„±λŠ₯ 병λͺ©: μ•Œλ¦Ό 처리 μ‹œ λ¦¬μ†ŒμŠ€κ°€ 많이 ν•„μš”ν•œ 경우, μ‹œμŠ€ν…œ κ³ΌλΆ€ν•˜ κ°€λŠ₯μ„± 쑴재

  • 규λͺ¨ ν™•μž₯μ„±: ν•œ λŒ€μ˜ μ„œλΉ„μŠ€λ‘œ λͺ¨λ“  νŠΈλž˜ν”½μ„ μ²˜λ¦¬ν•˜κΈ° νž˜λ“€μ–΄ μ§€λŠ” 것을 λŒ€λΉ„ν•˜μ—¬, λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ μΊμ‹œ λ“± μ€‘μš” μ»΄ν¬λ„ŒνŠΈ 규λͺ¨ ν™•μž₯ 방법 κ³ λ €

μ•Œλ¦Ό μ‹œμŠ€ν…œ 섀계

μœ„μ˜ λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ‹€μŒκ³Ό 같은 λ°©ν–₯으둜 κ°œμ„ ν•΄ λ³Ό 수 μžˆλ‹€.

  • λ°μ΄ν„°λ² μ΄μŠ€μ™€ μΊμ‹œλ₯Ό μ•Œλ¦Ό μ‹œμŠ€ν…œμ˜ μ£Ό μ„œλ²„μ—μ„œ 뢄리

  • μ•Œλ¦Ό μ„œλ²„λ₯Ό μ¦μ„€ν•˜κ³  μžλ™μœΌλ‘œ μˆ˜ν‰μ  규λͺ¨ ν™•μž₯이 κ°€λŠ₯ν•˜λ„λ‘ 섀계

  • λ©”μ‹œμ§€ 큐λ₯Ό μ΄μš©ν•΄ μ‹œμŠ€ν…œ μ»΄ν¬λ„ŒνŠΈ 사이 κ°•ν•œ 결함을 μ€„μž„(de-coupling)

각 μ»΄ν¬λ„ŒνŠΈλŠ” λ‹€μŒκ³Ό 같은 역할을 μˆ˜ν–‰ν•œλ‹€.

  • μ•Œλ¦Ό μ„œλ²„

    • μ•Œλ¦Ό 전솑 API 제곡: μ„œλΉ„μŠ€μ—μ„œ μ•Œλ¦Όμ„ μƒμ„±ν•˜κ³  전솑할 수 μžˆλ„λ‘ API 제곡

    • μ•Œλ¦Ό 검증: 이메일 / μ „ν™”λ²ˆν˜Έ λ“± 기본적인 검증 μˆ˜ν–‰

    • λ°μ΄ν„°λ² μ΄μŠ€ or μΊμ‹œ 질의: μ•Œλ¦Όμ— ν¬ν•¨μ‹œν‚¬ 데이터 쑰회

    • μ•Œλ¦Ό 전솑: μ•Œλ¦Ό 데이터λ₯Ό λ©”μ‹œμ§€ 큐에 전달

  • μΊμ‹œ: μ‚¬μš©μž 정보 / 단말 정보 / μ•Œλ¦Ό ν…œν”Œλ¦Ώ λ“± 캐싱

  • λ°μ΄ν„°λ² μ΄μŠ€: μ‚¬μš©μž 정보 / μ•Œλ¦Ό / μ„€μ • λ“± λ‹€μ–‘ν•œ 정보 μ €μž₯

  • λ©”μ‹œμ§€ 큐: μ‹œμŠ€ν…œ μ»΄ν¬λ„ŒνŠΈ κ°„ μ˜μ‘΄μ„± 제거λ₯Ό μœ„ν•΄ μ‚¬μš©, λŒ€λŸ‰ μ•Œλ¦Όμ΄ μ „μ†‘λ˜μ–΄μ•Ό ν•˜λŠ” 경우 λŒ€λΉ„ν•œ 버퍼 역할도 μˆ˜ν–‰

  • μž‘μ—… μ„œλ²„: λ©”μ‹œμ§€ νμ—μ„œ 전솑할 μ•Œλ¦Όμ„ κΊΌλ‚΄ μ„œλ“œνŒŒν‹° μ„œλΉ„μŠ€λ‘œ μ „λ‹¬ν•˜λŠ” μ—­ν•  μˆ˜ν–‰

결과적으둜 μ•Œλ¦Ό μ‹œμŠ€ν…œμ€ λ‹€μŒκ³Ό 같이 λ™μž‘ν•˜κ²Œ λœλ‹€.

  1. APIλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ•Œλ¦Ό μ„œλ²„λ‘œ μ•Œλ¦Ό 전솑

  2. μ•Œλ¦Ό μ„œλ²„λŠ” μ‚¬μš©μž 정보 / 단말 토큰 / μ•Œλ¦Ό μ„€μ • 같은 메타데이터λ₯Ό μΊμ‹œλ‚˜ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 쑰회

  3. μ•Œλ¦Ό μ„œλ²„λŠ” 전솑할 μ•Œλ¦Όμ— λ§žλŠ” 이벀트λ₯Ό 생성해 ν•΄λ‹Ή 이벀트λ₯Ό μœ„ν•œ 큐에 전달

  4. μž‘μ—… μ„œλ²„λŠ” λ©”μ‹œμ§€ νμ—μ„œ μ•Œλ¦Ό 이벀트λ₯Ό κΊΌλ‚΄ μ„œλ“œνŒŒν‹° μ„œλΉ„μŠ€λ‘œ 전달

  5. μ„œλ“œνŒŒν‹° μ„œλΉ„μŠ€μ—μ„œ λ””λ°”μ΄μŠ€λ‘œ μ‹€μ œ μ•Œλ¦Ό 전솑

μ•ˆμ •μ„±

  • 데이터 손싀 방지

    • μ•Œλ¦Όμ΄ μ§€μ—°λ˜κ±°λ‚˜ μˆœμ„œκ°€ λ’€λ°”λ€ŒλŠ” 것은 큰 λ¬Έμ œκ°€ λ˜μ§€ μ•Šμ„ 수 μžˆμ§€λ§Œ, μ•Œλ¦Όμ΄ μ „μ†‘λ˜μ§€ μ•ŠλŠ” 것은 큰 λ¬Έμ œκ°€ 될 수 있음

    • 이λ₯Ό μœ„ν•΄ μ•Œλ¦Ό 데이터λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— λ³΄κ΄€ν•˜κ³  μž¬μ‹œλ„ λ©”μ»€λ‹ˆμ¦˜ ν•„μš”

  • μ•Œλ¦Ό 쀑볡 전솑 방지

    • μ™„λ²½ν•˜κ²Œ 쀑볡을 λ°©μ§€ν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•˜λŠ” 것에 κ°€κΉμ§€λ§Œ, 쀑볡 전솑을 μ΅œμ†Œν™” ν•΄μ•Ό 함

    • 이벀트 ID κ²€μ‚¬ν•˜λŠ” 방식 λ“± 쀑볡 방지 둜직 μΆ”κ°€ ν•„μš”

μΆ”κ°€ κ³ λ € 사항

  • μ•Œλ¦Ό ν…œν”Œλ¦Ώ: λŒ€λΆ€λΆ„ ν˜•μ‹μ΄ λΉ„μŠ·ν•˜κΈ° λ•Œλ¬Έμ— ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•΄ μ•Œλ¦Όμ„ μƒμ„±ν•˜λŠ” 것이 효율적일 수 있음

  • μ•Œλ¦Ό μ„€μ •: μ‚¬μš©μžμ˜ μ•Œλ¦Ό 섀정을 λ³΄κ΄€ν•˜κΈ° μœ„ν•΄ μ•Œλ¦Ό μ„€μ • ν…Œμ΄λΈ”μ„ 두어 μ‚¬μš©μžκ°€ μ•Œλ¦Όμ„ 받을지 μ—¬λΆ€λ₯Ό μ„€μ •ν•  수 μžˆλ„λ‘ 함

  • μž¬μ‹œλ„ 방법: μ„œλ“œνŒŒν‹° μ„œλΉ„μŠ€μ—μ„œ μ•Œλ¦Ό 전솑 μ‹€νŒ¨ μ‹œ ν•΄λ‹Ή μ•Œλ¦Όμ„ μž¬μ‹œλ„ μ „μš© 큐에 λ„£μ–΄ μž¬μ‹œλ„ν•˜λŠ” 방법을 μ‚¬μš©

  • λ³΄μ•ˆ: iOS / Android 경우 νŠΉμ • ν‚€λ₯Ό μ‚¬μš©ν•΄ 승인된 ν΄λΌμ΄μ–ΈνŠΈλ§Œ μ•Œλ¦Όμ„ 보낼 수 μžˆλŠ”λ°, λ‹€λ₯Έ ν΄λΌμ΄μ–ΈνŠΈ(SMS / 이메일)도 같은 λ°©λ²•μœΌλ‘œ λ³΄μ•ˆμ„ κ°•ν™”ν•  수 있음

  • 큐 λͺ¨λ‹ˆν„°λ§: νŠΉμ • 큐에 μŒ“μΈ μ΄λ²€νŠΈκ°€ λ„ˆλ¬΄ λ§Žμ•„μ§€λ©΄(λΉ λ₯΄κ²Œ 처리 λͺ»ν•˜κ³  있음) μ‹œμŠ€ν…œμ— 영ν–₯을 쀄 수 μžˆμœΌλ―€λ‘œ 큐 λͺ¨λ‹ˆν„°λ§μ΄ ν•„μš”

참고자료

Last updated