Duolingo | Sending 6M+ Notifications Within 5 Seconds (KOR)

๐Ÿ”— ์ถœ์ฒ˜) David Mosyan

Overview

  • ๋“€์˜ค๋ง๊ณ ๋Š” 3140๋งŒ๋ช… DAU๋ฅผ ๊ฐ–๋Š” ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ์–ธ์–ด ํ•™์Šต ํ”Œ๋žซํผ์ด๋‹ค.

  • ์ˆ˜๋ฐฑ๋งŒ ์œ ์ €๋ฅผ ํƒ€๊ฒŸ์œผ๋กœ ์•Œ๋ฆผ์„ ํ•œ๋‹ค.

  • ๋งˆ์ผ€ํŒ…ํŒ€์˜ ์š”๊ตฌ์‚ฌํ•ญ์€ 5์ดˆ ์ด๋‚ด์— 600๋งŒ ๊ฐœ ์ด์ƒ์˜ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

Problems

  • ์ดˆ๋‹น 10,000๊ฐœ ์•Œ๋ฆผ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , 80๋ฐฐ ๋” ๋น ๋ฅธ ์†๋„๋กœ ์•Œ๋ฆผ์„ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค.

  • ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์—์„œ ๋ฐœ๊ฒฌ๋œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

  • ์•ฑ์— ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋ฉด ๋ฐฑ์—”๋“œ๋กœ ๋ฐ”๋กœ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.

  • ์ด๋Š” DDoS ๊ณต๊ฒฉ๊ณผ ๋น„์Šทํ–ˆ๋‹ค.

  • ๋“€์˜ค๋ง๊ณ ์˜ ์šด์˜ ์›์น™์€ ๋จผ์ € ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ์‹œ์Šคํ…œ์€ ์Šˆํผ๋ณผ ๋‹น์ผ์— ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์ค€๋น„๋˜์•ผ ํ•œ๋‹ค.

  • ์ด๋ฒคํŠธ ๋ฉฐ์น  ์ „์— ์‹œ์Šคํ…œ ํ™•์žฅ์‹œ ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค.

Solutions

  • ๋ณ€ํ™”ํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•œ๋‹ค.

  • ์ง€๋‚œ ๋ฉฐ์น ๊ฐ„ ๋ช‡ ๊ฐ€์ง€ ๋ณ€๊ฒฝ์€ ๊ดœ์ฐฎ์€๋ฐ, ๋‹ค๋ฅธ ๋ช‡ ๊ฐ€์ง€๋Š” ๊ธˆ์ง€๋˜์–ด ์žˆ๋‹ค.

  • ์˜ˆ๋ฅผ ๋“ค์–ด, "๊ธฐ๋ณธ์ ์œผ๋กœ ์ฒญ์ค‘ ๋ชฉ๋ก์„ ๋งˆ๋ฌด๋ฆฌํ•œ ํ›„ ์ „๋‚ ์— 200๋งŒ ๋ช…์˜ ์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ดœ์ฐฎ์„๊นŒ?" ๋‹ต์€ ์•„๋‹ˆ์˜ค์˜€๋‹ค.

  • ๋น ๋ฅด๊ฒŒ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์—†์—ˆ๊ณ , ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์œผ๋ฉด ์ถœ์‹œํ•˜์ง€ ์•Š์•˜๋‹ค.

  • ์†๋„ ๋ฌธ์ œ๋Š” ์ดˆ๋‹น 800,000 RPS์ด๋‹ค.

  • ํ˜„์žฌ ๋“€์˜ค๋ง๊ณ ๋Š” AWS๋กœ ๋งŽ์€ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. (S3, DynamoDB, SQS)

    • ์บ ํŽ˜์ธ ์‹œ์ž‘ ์ „, DynamoDB์—์„œ ์‚ฌ์šฉ์ž ๋ชฉ๋ก(UserId, DeviceId)์„ ๊ฐ€์ ธ์™€ S3์— ์ €์žฅํ•จ

    • ๋‹น์ผ์— ASG์™€ EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ํ™•์žฅํ•จ

    • ์ด์ „์— ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ–ˆ๋˜ S3์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•จ

    • ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ์šฉ์ž ID์—์„œ ๋””๋ฐ”์ด์Šค ID๋กœ ๋งคํ•‘๋จ

    • API ์„œ๋ฒ„๋Š” ์‹ค์ œ๋กœ 50๊ฐœ ์ด์ƒ ๋ฉ”์‹œ์ง€๋ฅผ FIFO SQS ๋Œ€๊ธฐ์—ด๋กœ ๋ณด๋ƒ„

    • ๊ทธ ์‚ฌ์ด์— ์ž„์‹œ ์›Œ์ปค๊ฐ€ ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  10,000๊ฐœ ์ด์ƒ์˜ SQS ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ค์Œ ๋Œ€๊ธฐ์—ด๋กœ ์ „์†กํ•จ

    • ๋งˆ์ง€๋ง‰์œผ๋กœ, ์•Œ๋ฆผ ์›Œ์ปค๊ฐ€ ์ผ๊ด„ APSN(์• ํ”Œ)์™€ FCM(๊ตฌ๊ธ€)์˜ API๋ฅผ ํ˜ธ์ถœํ•ด ์•Œ๋ฆผ์„ ๋ณด๋ƒ„

  • ์œ„ ์ž‘์—…๋“ค์—์„œ SQS ์ž์ฒด๋Š” ์ดˆ๋‹น 120,000๊ฐœ ๋ฉ”์‹œ์ง€๋ผ๋Š” Inflight Message Limit์ด ์žˆ๋‹ค. (SQS Inflight Message Limit: 120,000 MPS)

  • 5์ดˆ ์•ˆ์— ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด ๋ฐฐ์น˜ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

  • 500๋ช…์˜ iOS ์‚ฌ์šฉ์ž๋ฅผ ํ•˜๋‚˜์˜ ๋ฉ”์‹œ์ง€๋กœ, Android ์‚ฌ์šฉ์ž๋Š” 250๋ช…์œผ๋กœ ๋ฐฐ์น˜ ํ–ˆ๊ณ , ์ด๋Š” ์ œํ•œ ์ดํ•˜์˜€๋‹ค.

  • AWS๊ฐ€ ํ•„์š”ํ•œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๋•Œ ํ”„๋กœ๋น„์ €๋‹ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

  • AWS ๊ธฐ์ˆ  ๋‹ด๋‹น์ž์™€ ์—ฐ๋ฝํ•ด ์ธํ”„๋ผ ์ด๋ฒคํŠธ ๊ด€๋ฆฌ ๋ฌธ์„œ ์ดˆ์•ˆ์„ ์ž‘์„ฑํ–ˆ๋‹ค.

    • ํ™•์žฅ ์‹œ๊ธฐ์™€ ๋ฐฉ๋ฒ•, ์บ์‹œ ๋ฐ ์บ์‹œ ์—ฐ๊ฒฐ ์ œํ•œ, Dynamo ์ œํ•œ๊ณผ ๊ฐ™์€ ๊ตฌ์ฒด์  ๋‹จ๊ณ„ ์ •์˜ํ•จ

    • ์ „์šฉ ECS Cluster๋„ ์ผ๋ถ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋จ

Test

  • ์ฒ˜์Œ MVP ๋™์•ˆ์— ํ…Œ์ŠคํŠธ ๋™์•ˆ ๋ฌด์Œ ์•Œ๋ฆผ์„ ์‚ฌ์šฉํ•ด ์ˆ˜ํ–‰ํ–ˆ๋‹ค.

  • ๋ฐœ๊ฒฌ๋œ ๋ณ‘๋ชฉ ์ค‘ ํ•˜๋‚˜๋Š” ์Šค๋ ˆ๋“œ ์ˆ˜์˜€๋‹ค.

  • Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

  • ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ 10์—์„œ 5๋กœ, 1๋กœ ์ค„์ž„์œผ๋กœ์จ ์ด ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•˜๋Š”๋ฐ ๋„์›€์ด ๋˜์—ˆ๋‹ค.

  • ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ์•Œ๋ฆผ ์„œ๋น„์Šค์™€ ๋ฐฑ์—”๋“œ๋ฅผ ๋ชจ๋‘ ํ™•์žฅํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ–ˆ๋‹ค.

  • ์„œ๋น„์Šค๋Š” ๋‹ค๋ฅธ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๊ฐ€ ํ™•์žฅ๋  ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ–ˆ๊ณ , ๊ทธ ๋ฐ˜๋Œ€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€ ์˜€๋‹ค.

  • ๊ทธ๋ž˜์„œ ๋ณ„๋„์˜ ECS Cluster๋ฅผ ํ™œ์šฉํ–ˆ๋‹ค.

  • Zombie Mode๋ผ๋Š” ๋‚ด๋ถ€ ํˆด ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ…Œ์ŠคํŠธ ํ”„๋กœ์„ธ์Šค์— ํฐ ๋„์›€์ด ๋˜์—ˆ๋‹ค.

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๋ชจ๋“œ๊ฐ€ ์ผœ์ง€๋ฉด ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ๊ฐ€ ํ•ด๋‹น ํ”Œ๋ž˜๊ทธ๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•˜๋ ค ํ•  ๋•Œ ๊นŒ์ง€ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ๋ฐฑ์—”๋“œ์— ์š”์ฒญ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ๋ฐฑ์—”๋“œ๊ฐ€ ํŠธ๋ž˜ํ”ฝ ๊ธ‰์ฆ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๊ณ  ๋ณต๊ตฌํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ํ•„์š”ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๋„์›€์ด ๋˜์—ˆ๋‹ค.

๊ทธ ๊ฒฐ๊ณผ ์•Œ๋ฆผ์˜ 99%๋Š” 5.7์ดˆ ๋งŒ์— ์ฒ˜๋ฆฌ(P99)๋˜์—ˆ๊ณ , 95%๋Š” 3.9์ดˆ ๋งŒ์— ์ฒ˜๋ฆฌ(P95)๋˜์—ˆ๋‹ค.


Lessons Learned

๋””์ž์ธ์— ๋Œ€ํ•ด์„œ ์—ด๋ฆฐ ๋งˆ์Œ, ํ…Œ์ŠคํŠธ๋Š” ์—„๊ฒฉํ•˜๊ฒŒ

  • ์ตœ๊ณ ์˜ ๋””์ž์ธ์€ ์—†์Œ์„ ์ธ์ •ํ•˜๊ธฐ

  • ๋ฐ˜๋ณต๊ณผ ํ…Œ์ŠคํŠธ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๋””์ž์ธ์„ ์„ ํƒ

  • ์‹œ์Šคํ…œ์ด ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์ค‘์š”์„ฑ ์ธ์‹

ํšŒ๋ณต์„ฑ๊ณผ ๊ฒฌ๊ณ ์„ฑ์„ ์šฐ์„ ์‹œ

  • ์‹œ์Šคํ…œ์€ ์ค‘๋ณต๋œ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜๋Š” ๊ฒƒ๊ณผ ๋™์‹œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด์•ผ ํ•จ

์‹คํŒจ์— ๋Œ€๋น„ํ•˜๊ณ  ์ ๊ทน์ ์œผ๋กœ ๋Œ€์‘ํ•˜๋ผ

  • ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์ค‘์š”ํ•œ ์ˆœ๊ฐ„์— ์ทจํ•ด์•ผ ํ•  ๊ฒƒ๋“ค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ํ•ธ๋“œ๋ถ์„ ์ž‘์„ฑํ•ด์•ผ ํ•จ

  • ๋‹ค์–‘ํ•œ ์‹คํŒจ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ๋ฐฑ์—… ๊ณ„ํš์ด ํฌํ•จ๋˜์–ด์•ผ ํ•จ

  • ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์„ ๋•Œ ์ค€๋น„ํ•  ๊ฒƒ, ์ ๊ทน์ ์ธ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋Œ€ํ•œ ํ—Œ์‹ ์„ ๋ฐ˜์˜ํ•ด์•ผ ํ•จ

ย