- ์๋น์ค ๊ธฐํ ๋ฐฐ๊ฒฝ: ์ค๊ณ ์ฑ ๊ฑฐ๋๋ ์ง์ ๊ฐ๋ฅํ ์๋น๋ฅผ ์ด์งํ๊ณ ํ๊ฒฝ ๋ณดํธ์ ๊ธฐ์ฌํฉ๋๋ค. ์ด๋ ์ฑ ์ ์ฌ์ฌ์ฉํ์ฌ ์์ ์๋ชจ๋ฅผ ์ค์ด๊ณ , ๋ ๋ง์ ์ฌ๋๋ค์ด ์ ๋ ดํ๊ฒ ์ง์์ ์ ํ ์ ์๋๋ก ๋์ต๋๋ค. ๋ฐ๋ผ์ ์ค๊ณ ์ฑ ์ ์ํ ์ ๋ขฐํ ์ ์๋ ํ๋ซํผ์ ๊ตฌ์ถํ์ฌ ์ฌ์ฉ์๋ค์๊ฒ ๋ ๋์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒ์ด ํ์ํฉ๋๋ค.
- ์๋น์ค ๊ธฐ๋ ํจ๊ณผ: ์ค๊ณ ์ฑ ๊ฑฐ๋๋ ์นํ๊ฒฝ ์๋น ๋ฌธํ๋ฅผ ํ์ฐ์ํค๊ณ , ๋ ์์ ํ์ต์ ๊ธฐํ๋ฅผ ํ๋ํฉ๋๋ค. ํ๊ฒฝ ๋ณดํธ์ ์ง์ ๊ณต์ ๋ฅผ ๊ฒฐํฉํ ์ง์ ๊ฐ๋ฅํ ๋ชจ๋ธ๋ก ์ฌํ์ ๊ธ์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
- ์นด์นด์ค ์์ ๋ก๊ทธ์ธ ์ฐ๋์ผ๋ก ํ์๊ฐ์ ๋ฐ ๋ก๊ทธ์ธ ์ ์ฐจ ๊ฐ์ํ
- OAuth 2.0 ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐ ๋ณด์ ๊ฐํ
- ๋ค์ํ ์ ๋ ฌ(๏ฟฝ๏ฟฝ๏ฟฝ์ ์, ์ธ๊ธฐ์, ๊ฐ๊ฒฉ์ ๋ฑ) ๊ธฐ๋ฅ ์ ๊ณต
- ๋ฌดํ ์คํฌ๋กค ๋ฆฌ์คํธ๋ก ์ฌ์ฉ์ ๊ฒฝํ ํฅ์
- ์ฃผ์ ๊ฒ์์ด ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฑ๋ก์ผ๋ก ๋น ๋ฅธ ๋งค๋ฌผ ํ์ ์ง์
- ์ฐ ๊ธฐ๋ฅ์ ํตํด ๊ด์ฌ ๋งค๋ฌผ์ ์ํ ์ถ์ ๊ฐ๋ฅ
- ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฐ ์ฐ ๋ชฉ๋ก์ ๋ํ ์ค์๊ฐ ์๋ฆผ ์ ๊ณต
- ๊ฑฐ๋ ์ํ, ๊ฐ๊ฒฉ ๋ณ๋ ๋ฑ ์ฃผ์ ์ด๋ฒคํธ ์๋ฆผ
- ๊ฑฐ๋ ํ๋์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์๋ฅผ ๋ฐ์๋ฒจ ๋จ์๋ก ๋ถ๋ฅ
- ์ฑ ์ ๋ฉ์ธ ์ฝํ ์ธ ๋ก ํ์ฌ, ๋๋ํ ๋๋ฌผ(๋๊ณ ๋) ์ปจ์ ์ ๋ฑ๊ธ ์์คํ ์ ์ฉ
- ํ๋งค์์ ๊ตฌ๋งค์ ๊ฐ 1:1 ์ฑํ ๊ธฐ๋ฅ ์ ๊ณต
- ๊ฑฐ๋ ์ํ(์งํ, ์๋ฃ ๋ฑ) ์ ์ฅ ๋ฐ ๊ด๋ฆฌ
- ๋์ API ์ฐ๋์ ํตํ ์ค์๊ฐ ์ ๊ฐ ๋ฐ ์์ธ ์ ๋ณด ์ ๊ณต
- ๋ค์ํ ๋งค๋ฌผ ๊ฐ ๊ฐ๊ฒฉ ๋น๊ต ๊ธฐ๋ฅ ์ง์
์๋น์ค ์ํคํ ์ฒ
๐ ๋ฌธ์ ์ํฉ
- 1๋1 ์ฑํ ์ง์ ์, ์ฌ์ฉ์์ member id๋ฅผ ๊ฐ์ง๊ณ ๋ค์ ๋๋ค์์ ์กฐํํด์ผํ๋ ๋ถํ์ํ DB ์ ๊ทผ์ด ํ์.
- ๋งค๋ฒ ์ธ์ฆ ๋จ๊ณ์์ ์ถ๊ฐ์ ์ธ DB ์ ๊ทผ์ผ๋ก ๋ณ๋ชฉ ํ์์ด ๋ฐ์.
โ ๊ฐ์ ๋ฐฉํฅ
- token claim์ ์ฌ์ฉ์ ๋๋ค์ ์ถ๊ฐ : ์ฌ์ฉ์์ ๋๋ค์์ access token์ claim์ ํฌํจ์์ผ, DB์ ๋ํ ๋ถํ์ํ ์กฐํ๋ฅผ ์ต์ํ.
- token ํค๋์ ํฌ๊ธฐ ์ฆ๊ฐ ์ ๋ํ ํด๊ฒฐ : ํ ํฐ ํค๋์ ํฌ๊ธฐ๋ ์ฝ 31๋ฐ์ดํธ ์ฆ๊ฐ(920๋ฐ์ดํธ โ 951๋ฐ์ดํธ)ํ์ง๋ง, ์ด๋ DB ์ ๊ทผ์ ์ค์ด๋ ๊ฒ์ ๋นํด ๋ฏธ๋ฏธํ ์ค๋ฒํค๋.
๐ ๋ฌธ์ ์ํฉ
-
๋จ์ผ ์๋ฒ์์ ์ฝ 100๋ช ์ ์ ์ ๊ฐ ๋์์ 1000๊ฐ์ ๋ฉ์ธ์ง๋ฅผ ๊ฐ์ ์ฑํ ๋ฐฉ์ ๋ณด๋ผ ๊ฒฝ์ฐ, ํธ๋ํฝ ๋์ ์ผ๋ก ์ธํ HTTP 504 Gateway Timeout ๋ฐ์
-
์๋ต ์๊ฐ ๊ทธ๋ํ๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก 0ms๋ก ๋จ์ด์ง๋ฉฐ ์ฐ๊ฒฐ์ด ๋๊ธฐ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ ํ์ -> ์๋น์ค ๋ถ๋ฅ ๋๋ ์๋ต ์ง์ฐ์ผ๋ก ํด์ ๊ฐ๋ฅ
-> http/1.1์ ๋ผ์ธ ๋ธ๋กํน ๋ฐ stomp ์ธ์ ๊ด๋ฆฌ ๋ฐ ๋ฆฌ์์ค์ ํ๊ณ๋ก ์ถ์
โ ๊ฐ์ ๋ฐฉํฅ
- Netty-Websocket ๋ฐ RabbitMQ๋ฅผ ํตํด ์ฑ๋ฅ ๋ฐ ๊ธฐ๋ฅ ๋น๊ต ํ ์ฑ๋ฅ ๊ณ ๋ํ
1๏ธโฃ Netty-Websocket
- HTTP/1.1์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ณ , ๋ ๋ฎ์ ๋ ๋ฒจ์ ๋คํธ์ํฌ ์ ์ด๋ฅผ ํตํด ์ฑ๋ฅ์ ์ต์ ํํ๊ณ ์ Netty ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ WebSocket + STOMP ์๋ฒ๋ฅผ ์ง์ ๊ตฌํ ์๋
โ ๋ฌธ์ ์
-
STOMP ํ๋กํ ์ฝ ์ง์ ๊ตฌํ ํ์
- ๊ธฐ์กด์ ๊ตฌํ๋์ด์๋ ๋ชจ๋ ์ด๋ ธํ ์ด์ ์ผ๋ก ์ด๋ฃจ์ด์ง STOMP ํ๋กํ ์ฝ ์ง์ ๊ตฌํ ํ์
-
HTTP ํธ๋์ ฐ์ดํฌ -> WebSocket ์ ๊ทธ๋ ์ด๋ -> WebSocketFrame -> ByteBuf (STOMP ์ฝ๋ฑ์ฉ) -> StompFrame (์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ฉ)์ผ๋ก ์ด์ด์ง๋ ์ธ๋ฐ์ด๋ ๋ฐ์ดํฐ ๋ณํ๊ณผ ๊ทธ ์ญ์ ์์๋ฐ์ด๋ ๋ณํ ๊ณผ์ ์์์ ๋ณต์ก์ฑ
-
ByteBuf์ ์ฐธ์กฐ ์นด์ดํธ ๊ด๋ฆฌ(retain(), release()) ๋ฏธํก์ผ๋ก ์ธํ ๋ฉ๋ชจ๋ฆฌ ๋์ ๊ฐ๋ฅ์ฑ
-> Netty๋ ๋์ ์ ์ฐ์ฑ๊ณผ ์ฑ๋ฅ ์ ์ฌ๋ ฅ์ ์ ๊ณตํ์ง๋ง, STOMP์ ๊ฐ์ ๊ณ ์์ค ํ๋กํ ์ฝ์ ์ง์ ๊ตฌํํ๋ ๊ฒ์ ์๋นํ ๊ฐ๋ฐ ์๊ฐ๊ณผ Netty ๋ด๋ถ ๋์์ ๋ํ ๊น์ ์ดํด๋ฅผ ์๊ตฌํจ ํ์ต ๊ณก์ ์ด ๋งค์ฐ ๊ฐํ๋ฅด๊ณ , ์์ ์ ์ธ ๊ตฌํ๊น์ง ๋ง์ ๋๋ฒ๊น ๋ ธ๋ ฅ์ด ํ์ํ์ฌ ํ์ฌ ํ๋ก์ ํธ์ ์์๊ณผ ์ผ์ ์ ๊ณ ๋ คํ์ ๋ ์ค์ง์ ์ธ ์ฑ๋ฅ ํฅ์ ์ธก์ ๋จ๊ณ๊น์ง ๋์๊ฐ๊ธฐ ์ด๋ ค์
2๏ธโฃ ๋ฉ์ธ์ง ํ
- WebSocket/STOMP ํ๋กํ ์ฝ ์์ฒด๋ฅผ ๋ฐฐ์ ํ๊ณ , ํด๋ผ์ด์ธํธ์ ๏ฟฝ๏ฟฝ๏ฟฝ๋ฒ๊ฐ ๋ฉ์ธ์ง ํ๋ฅผ ํตํด ์ง์ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ์ฌ ํต์ ์์ ์ฑ ๋ฐ ์ฑ๋ฅ ํน์ฑ ํ๊ฐ
- ํ๋ก์ ํธ ๊ธฐ๊ฐ ๋ฐ ํ์ต ๊ณก์ ์ ๊ณ ๋ คํ๊ณ , DeadLetterQueue ๊ตฌํ์ ์ฉ์ดํ RabbitMQ ์ฑํ
-> ํ ์คํธ ํ๋ก์ฐ์ ํ ์คํธ ํด์ด publish -> consume ๊น์ง์ ์ผ๋ ฌ์ ๊ณผ์ ์ ๋ค ๋ฐ์์ผ ์๋ต ์๊ฐ์ด ์ธก์ ๋๊ธฐ์ ์ค์ ์๊ฐ๊ณผ ์๋นํ ์ฐจ์ด ์กด์ฌ
โ ๋ฌธ์ ์
- ๊ฐ ์ฑํ
์ฑ๋์ ๋ํ queue ์ ํ ํ์
- ํ ์ฑํ ๋ฐฉ์ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋ค์ด์ฌ ๋, ์ฌ์ฉ์์ ์ธ์์ ๋ฐ ์๋ฒ ์คํ ๊ณ ๋ ค ํ์
** ์ฑ๋ฅ ๋น๊ต **
| ๊ธฐ์ค | Netty-WebSocket | RabbitMQ |
|---|---|---|
| ์ต๋ TPS | 70K/s (๋จ์ผ ์๋ฒ) | 50K/s (๋จ์ผ ๋ ธ๋), ํด๋ฌ์คํฐ๋ง ์ ํ์ฅ |
| ์ง์ฐ ์๊ฐ | 1ms~3ms | 2ms~15ms |
| ์ฅ์ ๋ณต๊ตฌ | ์๋ ๊ตฌํ ํ์ | DLQ/๋ฏธ๋ฌ๋งํ ์๋ ๋ณต๊ตฌ |
| ๊ฐ๋ฐ ๋ณต์ก๋ | ํ๋กํ ์ฝ ํธ๋ค๋ฌ ์ง์ ๊ตฌํ | ์คํ๋ง ํตํฉ์ผ๋ก ์ ์ ์ ์ฉ |
| ํ์ฅ์ฑ | ๋ก๋๋ฐธ๋ฐ์ ์ถ๊ฐ ํ์ | ํด๋ฌ์คํฐ ์๋ ํ์ฅ |
| ์ต์ ์ฌ์ฉ ์ฌ๋ก | ์ด์ ์ง์ฐ 1:1 ํต์ | ๋ณต์กํ ๋ฉ์์ง ๋ผ์ฐํ /์ฌ์๋ ํ์ ์ |
๊ฒฐ๋ก
- ๋ฉ์ธ์ง ์ํ ์ ์ง ๋ฐ ์ดํ ์ฌ์ฉ์์ ์๋น์ค ํ์ฅ์ ๋ฐ๋ฅธ ํ์ฅ์ฑ ์ฉ์ด
- ๋ํ AMPQ (๋ฐ์ด๋๋ฆฌ ํ๋กํ ์ฝ)์ ์ฌ์ฉํ์ฌ text ๊ธฐ๋ฐ์ Stomp๋ณด๋ค ์์ ํฌ๊ธฐ
- ๋ฉ์ธ์ง๋ฅผ ์ฌ์ฉํ ๋น๋๊ธฐ ๋ก์ง์ผ๋ก์ ์ดํ ์๋ฒ ๋ถ๋ฆฌ์ ์์กด์ฑ ๋ฎ์ถ๊ณ ๊ฒฐํฉ์ฑ ๋์ด๊ธฐ ์ฉ์ด
-> ๋ฉ์ธ์ง ํ๋ฅผ ํตํ ์ฑํ ์๋น์ค๋ก ๋ณ๊ฒฝ


