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
๋์์ธ์ ๋ํด์ ์ด๋ฆฐ ๋ง์, ํ ์คํธ๋ ์๊ฒฉํ๊ฒ
์ต๊ณ ์ ๋์์ธ์ ์์์ ์ธ์ ํ๊ธฐ
๋ฐ๋ณต๊ณผ ํ ์คํธ๋ฅผ ํ์ฉํ๋ ๋์์ธ์ ์ ํ
์์คํ ์ด ์๋ํ ๋๋ก ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ํ ์คํธ ์ค์์ฑ ์ธ์
ํ๋ณต์ฑ๊ณผ ๊ฒฌ๊ณ ์ฑ์ ์ฐ์ ์
- ์์คํ ์ ์ค๋ณต๋ ๋ฉ์์ง๊ฐ ์ ์ก๋๋ ๊ฒ๊ณผ ๋์ ์์ ์ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋์ด์ผ ํจ
์คํจ์ ๋๋นํ๊ณ ์ ๊ทน์ ์ผ๋ก ๋์ํ๋ผ
์์ง๋์ด๊ฐ ์ค์ํ ์๊ฐ์ ์ทจํด์ผ ํ ๊ฒ๋ค์ ๋ํ ์์ธํ ํธ๋๋ถ์ ์์ฑํด์ผ ํจ
๋ค์ํ ์คํจ ์๋๋ฆฌ์ค์ ๋ํ ๋ฐฑ์ ๊ณํ์ด ํฌํจ๋์ด์ผ ํจ
๋ฌธ์ ์ ์ง๋ฉดํ์ ๋ ์ค๋นํ ๊ฒ, ์ ๊ทน์ ์ธ ๋ฌธ์ ํด๊ฒฐ์ ๋ํ ํ์ ์ ๋ฐ์ํด์ผ ํจ