1๋จ๊ณ. ๋ฌธ์ ์ดํด ๋ฐ ์ค๊ณ ๋ฒ์ ํ์
ํ์ด์ค๋ถ ๋ฉ์ ์ , ์์ฑ(WeChat), ์์ธ ์ฑ(WhatsApp) ์ฒ๋ผ 1:1 ์ฑํ ์ ์ง์คํ๋ ์ฑ, ์ฌ๋(Slack) ๊ฐ์ ๊ทธ๋ฃน ์ฑํ ์ ์ค์ ์ ๋ ์ ๋ฌด์ฉ ์ฑ, ๊ฒ์ ์ฑํ ์ ์ฐ์ด๋ ๋์ค์ฝ๋(Discord) ๊ฐ์ด ๋๊ท๋ชจ ๊ทธ๋ฃน์ ์ํต๊ณผ ์๋ต์ง์ฐ(latency)์ด ๋ฎ์ ์์ฑ ์ฑํ ์ ์ง์คํ๋ ์ฑ
์๊ตฌ์ฌํญ
1. ์๋ต์ง์ฐ์ด ๋ฎ์ 1:1 ์ฑํ
๊ธฐ๋ฅ
2. ์ต๋ 100๋ช
๊น์ง ์ฐธ์ฌํ ์ ์๋ ๊ทธ๋ฃน ์ฑํ
๊ธฐ๋ฅ
3. ์ฌ์ฉ์์ ์ ์ ์ํ ํ์ ๊ธฐ๋ฅ
4. ๋ค์ํ ๋จ๋ง ์ง์. ํ๋์ ๊ณ์ ์ผ๋ก ์ฌ๋ฌ ๋จ๋ง์ ๋์ ์ ์ ์ง์
5. ํธ์ ์๋ฆผ
6. 5,000๋ง DAU(Daily Active User: ์ผ๋ณ ๋ฅ๋ ์ฌ์ฉ์ ์) ์ฒ๋ฆฌ
2๋จ๊ณ. ๊ฐ๋ต์ ์ค๊ณ์ ์ ์ ๋ฐ ๋์ ๊ตฌํ๊ธฐ
์ด ์ฑํ ์๋น์ค๋ ์๋ ๊ธฐ๋ฅ ์ ์ ๊ณตํด์ผ ํ๋ค.
* ํด๋ผ์ด์ธํธ๋ค๋ก๋ถํฐ ๋ฉ์ธ์ง ์์
* ๋ฉ์ธ์ง ์์ ์(recipient) ๊ฒฐ์ ๋ฐ ์ ๋ฌ
* ์์ ์๊ฐ ์ ์(online) ์ํ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ ์ํ ๋๊น์ง ํด๋น ๋ฉ์ธ์ง๋ฅผ ๋ณด๊ด
์ฑํ
์๋น์ค์์ ์ ์์๋ Keep-alive ํค๋๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์จ์
1. ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ ์ฐ๊ฒฐ์ ๋์ง ์๊ณ ๊ณ์ ์ ์งํ ์ ์์
2. TCP ์ ์ ๊ณผ์ ์์ ๋ฐ์ํ๋ ํธ๋์
ฐ์ดํฌ(hand-shake) ํ์๋ฅผ ์ค์ผ ์ ์์
ํ์ง๋ง ๋ฉ์ธ์ง ์์ ์๋๋ฆฌ์ค๋ ์ด๊ฒ๋ณด๋ค ๋ณต์ก: ํด๋ง(polling), ๋กฑ ํด๋ง(long polling), ์น์์ผ(WebSocket) ๋ฑ์ ๊ธฐ์ ์ ์ฌ์ฉํด์ผ ํจ
ํด๋ง(Polling)
ํด๋ง(polling) : ํด๋ผ์ด์ธํธ๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์๋ฒ์๊ฒ ์ ๋ฉ์ธ์ง๊ฐ ์๋๊ณ ๋ฌผ์ด๋ณด๋ ๋ฐฉ๋ฒ
-. ํด๋ง ๋น์ฉ์ ํด๋ง์ ์์ฃผํ๋ฉด ํ ์๋ก ์ฌ๋ผ๊ฐ: ๋ตํด์ค ๋ฉ์ธ์ง๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์๋ฒ ์์์ด ๋ถํ์ํ๊ฒ ๋ญ๋น.
๋กฑํด๋ง(Long Polling)
ํด๋ผ์ด์ธํธ๋ ์ ๋ฉ์ธ์ง๊ฐ ๋ฐํ๋๊ฑฐ๋ ํ์์์ ๋ ๋๊น์ง ์ฐ๊ฒฐ์ ์ ์ง
-. ํด๋ผ์ด์ธํธ: ์ ๋ฉ์ธ์ง๋ฅผ ๋ฐ์ผ๋ฉด ๊ธฐ์กด ์ฐ๊ฒฐ์ ์ข
๋ฃํ๊ณ ์๋ฒ์ ์๋ก์ด ์์ฒญ์ ๋ณด๋ด์ ๋ชจ๋ ์ ์ฐจ๋ฅผ ๋ค์ ์์
๋กฑํด๋ง(long polling)์ ์ฝ์
- ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ ํด๋ผ์ด์ธํธ์ ์์ ํ๋ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ์ฑํ ์๋ฒ์ ์ ์ํ๊ฒ ๋์ง ์์์๋..
- HTTP ์๋ฒ๋ค์ ๋ณดํต ๋ฌด์ํ(STATELEE) ์๋ฒ : ๋ก๋๋ฐธ๋ฐ์ฑ์ ์ํด ๋ผ์ด๋ ๋ก๋น(Round Robin) ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์์ ๊ฐ์ ๊ฐ๋ฅ์ฑ์ด ์๊ธธ ์๋ ์์
?
- ์๋ฒ ์ ์ฅ์์๋ ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ์ ํด์ ํ๋์ง ์๋์ง ์ ์ข์ ๋ฐฉ๋ฒ์ด ์์
- ๋นํจ์จ์ : ๋ฉ์ธ์ง๋ฅผ ๋ง์ด ์ ๋ฐ๋ ํด๋ผ์ ๊ฒฝ์ฐ ํ์์์์ด ์ผ์ด๋ ๋๋ง๋ค ์ฃผ๊ธฐ์ ์ผ๋ก ์๋ฒ์ ์ฌ์ ์
์น์์ผ(Websocket)
์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ๋น๋๊ธฐ(async) ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ผ ๋ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉํ๋ ๊ธฐ์
- ํ๋ฒ ๋งบ์ด์ง ์ฐ๊ฒฐ์ ํญ๊ตฌ์ ์ด๋ฉฐ ์๋ฐฉํฅ
- ์น์์ผ์ 80์ด๋ 443์ฒ๋ผ HTTP ํน์ HTTPS ํ๋กํ ์ฝ์ด ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ํฌํธ๋ฒํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ๋ฐฉํ๋ฒฝ์ด ์๋ ํ๊ฒฝ์์๋ ์ ์๋ํจ
์น์์ผ ์ด์ฉ ์ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ผ ๋๋ ๋ฐ์ ๋ ๋์ผํ ํ๋กํ ์ฝ์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์ค๊ณ ๋ฟ ์๋๋ผ ๊ตฌํ ๋ํ ๋จ์ํ๊ณ ์ง๊ด์
๊ฐ๋ต์ ์ค๊ณ์
์ฃผ ํต์ ํ๋กํ ์ฝ์ ์น์์ผ ์ฌ์ฉ
1. ๋ฌด์ํ ์๋น์ค
๋ก๊ทธ์ธ, ํ์๊ฐ์
, ์ฌ์ฉ์ ํ๋กํ์ผ ํ์ ๋ฑ์ ์ฒ๋ฆฌํ๋ ์ ํต์ ์ธ ์์ฒญ/์๋ต ์๋น์ค
๋ก๋๋ฐธ๋ฐ์ ๋ค์ ์์น: ๋ก๋๋ฐธ๋ฐ์๋ ์์ฒญ์ ๊ทธ ๊ฒฝ๋ก์ ๋ง๋ ์๋น์ค๋ก ์ ํํ๊ฒ ์ ๋ฌํ๋ค.
์๋น์ค๋ค ๊ฐ์ด๋ฐ ์๋น์๊ฐ ์์ฅ์ ์์ ํ์ผ๋ก ๋์ ์์ด์ ์ฐ๋ฆฌ๊ฐ ์ง์ ๊ตฌํํ์ง ์์๋ ์ฝ๊ฒ ์ฌ์ ์ธ ์ ์์.
์๋น์ค ํ์(service discovery): ํด๋ผ์ด์ธํธ๊ฐ ์ ์ํ ์ฑํ ์๋ฒ์ DNS ํธ์คํธ๋ช ์ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ ค์ฃผ๋ ์ญํ
2. ์ํ์ ์ง(stateful) ์๋น์ค
์ํ ์ ์ง๊ฐ ํ์ํ ์๋น์ค๋ ์ฑํ
์๋น์ค : ๊ฐ ํด๋ผ์ด์ธํธ๊ฐ ์ฑํ
์๋ฒ์ ๋
๋ฆฝ์ ์ธ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ์ ์งํด์ผ ํ๊ธฐ ๋๋ฌธ
3. ์ 3์ ์๋น์ค ์ฐ๋
์ฑํ
์ฑ์์ ๊ฐ์ฅ ์ค์ํ ์ 3์ ์๋น์ค๋ ํธ์ ์๋ฆผ.
4. ๊ท๋ชจ ํ์ฅ์ฑ
์๋ฒ ํ ๋๋ก ์ผ๋ง๋ ๋ง์ ์ ์์ ๋์์ ํ์ฉํ ์ ์๋๋
5. ์ ์ฅ์
์ฑํ
์์คํ
์ด ๋ค๋ฃจ๋ ๋ฐ์ดํฐ์ ์ข
๋ฅ
1. ์ฌ์ฉ์ ํ๋กํ์ผ, ์ค์ , ์น๊ตฌ ๋ชฉ๋ก์ฒ๋ผ ์ผ๋ฐ์ ์ธ ๋ฐ์ดํฐ
- ์์ ์ฑ์ ๋ณด์ฅํ๋ ๊ด๊ณํ DB์ ๋ณด๊ด : ๋ค์คํ(replication)์ ์ค๋ฉ(sharding)
2. ์ฑํ
์์คํ
์ ๊ณ ์ ํ ๋ฐ์ดํฐ๋ก ์ฑํ
์ด๋ ฅ(chat history)
ํค-๊ฐ ์ ์ฅ์๋ฅผ ์ถ์ฒ ์ฌ์ :
1. ์ํ์ ๊ท๋ชจํ์ฅ(horizontal scaling)์ด ์ฌ์
2. ๋ฐ์ดํฐ ์ ๊ทผ ์ง์ฐ์๊ฐ(letency)๊ฐ ๋ฎ์
3. ๊ด๊ณํ DB๋ ๋ฐ์ดํฐ ๊ฐ์ด๋ฐ ๋กฑ ํ
์ผ(long tail)์ ํด๋นํ๋ ๋ถ๋ถ์ ์ ์ฒ๋ฆฌํ์ง ๋ชปํจ
- ์ธ๋ฑ์ค๊ฐ ์ปค์ง๋ฉด ๋ฐ์ดํฐ์ ๋ํ ๋ฌด์์์ ์ ๊ทผ(random access)๋ฅผ ์ฒ๋ฆฌํ๋ ๋น์ฉ์ด ๋์ด๋จ
4. ํ์ด์ค๋ถ๊ณผ ๋์ค์ฝ๋๋ ํ์ฌ ์ฌ์ฉ์ค
6. ๋ฐ์ดํฐ ๋ชจ๋ธ
1:1 ์ฑํ
์ ์ํ ๋ฉ์ธ์ง ํ
์ด๋ธ
๊ทธ๋ฃน ์ฑํ
์ ์ํ ๋ฉ์ธ์ง ํ
์ด๋ธ
7. ๋ฉ์ธ์ง ID
๋ฉ์ธ์ง ID๋ ๋ค์๊ณผ ๊ฐ์ ์์ฑ์ ๋ง์กฑํด์ผ ํจ
1. MESSAGE_ID ์ ๊ฐ์ ๊ณ ์ ํด์ผ ํจ(uniqueness)
2. ID ๊ฐ์ ์ ๋ ฌ ๊ฐ๋ฅํด์ผ ํ๋ฉฐ ์๊ฐ ์์์ ์ผ์นํด์ผ ํจ.
์ฆ, ์๋ก์ด ID๋ ์ด์ ID๋ณด๋ค ํฐ ๊ฐ์ด์ด์ผ ํ๋ค.
3๋จ๊ณ. ์์ธ ์ค๊ณ
์๋น์ค ํ์
์๋น์ค ํ์ ๊ธฐ๋ฅ์ ์ฃผ๋ ์ญํ ์ ํด๋ผ์ด์ธํธ์๊ฒ ๊ฐ์ฅ ์ ํฉํ ์ฑํ
์๋ฒ๋ฅผ ์ถ์ฒํ๋ ๊ฒ
: ์ฌ์ฉ๋๋ ๊ธฐ์ค์ผ๋ก๋ 1) ํด๋ผ์ด์ธํธ ์์น(geograpical location), 2) ์๋ฒ์ ์ฉ๋(capacity) ๋ฑ์ด ์์.
๋ฉ์ธ์ง ํ๋ฆ
1:1 ์ฑํ ๋ฉ์ธ์ง ์ฒ๋ฆฌ ํ๋ฆ
์ฌ๋ฌ ๋จ๋ง ์ฌ์ด์ ๋ฉ์ธ์ง ๋๊ธฐํ
์๊ท๋ชจ ๊ทธ๋ฃน ์ฑํ ์์์ ๋ฉ์ธ์ง ํ๋ฆ
์ ์์ํ ํ์
์ฌ์ฉ์ ๋ก๊ทธ์ธ
ํด๋ผ์ด์ธํธ์ ์ค์๊ฐ ์๋น์ค(real-time service) ์ฌ์ด์ ์น์์ผ ์ฐ๊ฒฐ์ด ๋งบ์ด์ง๊ณ ๋๋ฉด
์ ์์ํ ์๋ฒ๋ A์ ์ํ์ last-active-at ํ์์คํฌํ ๊ฐ์ ํค-๊ฐ ์ ์ฅ์์ ๋ณด๊ด
→ ์ด ์ ์ฐจ๊ฐ ๋๋๊ณ ๋๋ฉด ํด๋น ์ฌ์ฉ์๋ ์ ์ ์ค์ธ ๊ฒ์ผ๋ก ํ์
๋ก๊ทธ์์
์ ์์ฅ์
๋ฐ๋(heartbeat) ๊ฒ์ฌ๋ฅผ ํตํด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
์ํ ์ ๋ณด์ ์ ์ก
๋ฐํ-๊ตฌ๋
๋ชจ๋ธ(publish-subscribe model) ์ฌ์ฉ
: ๊ฐ๊ฐ์ ์น๊ตฌ๊ด๊ณ๋ง๋ค ์ฑ๋์ ํ๋์ฉ ๋๋ ๊ฒ
: ๊ทธ๋ฃน์ ํฌ๊ธฐ๊ฐ ์์ ๋์ ํจ๊ณผ์
์ฑ๋ฅ ๋ฌธ์ ํด์ ๋ฐฉ๋ฒ
์ฌ์ฉ์๊ฐ ๊ทธ๋ฃน ์ฑํ
์ ์
์ฅํ๋ ์๊ฐ์๋ง ์ํ ์ ๋ณด๋ฅผ ์ฝ์ด๊ฐ๊ฒ ํ๊ฑฐ๋, ์น๊ตฌ ๋ฆฌ์คํธ์ ์๋ ์ฌ์ฉ์์ ์ ์์ํ๋ฅผ ๊ฐฑ์ ํ๊ณ ์ถ์ผ๋ฉด ์๋์ผ๋ก(manual) ํ๋๋ก ์ ๋ํ๊ธฐ