Skip to content
@Book-Wave

Book Wave

๐Ÿ“š Book_wave

๐Ÿ”– ์„œ๋น„์Šค ๊ฐœ์š”

  • ์„œ๋น„์Šค ๊ธฐํš ๋ฐฐ๊ฒฝ: ์ค‘๊ณ ์ฑ… ๊ฑฐ๋ž˜๋Š” ์ง€์† ๊ฐ€๋Šฅํ•œ ์†Œ๋น„๋ฅผ ์ด‰์ง„ํ•˜๊ณ  ํ™˜๊ฒฝ ๋ณดํ˜ธ์— ๊ธฐ์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฑ…์„ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ์ž์› ์†Œ๋ชจ๋ฅผ ์ค„์ด๊ณ , ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ €๋ ดํ•˜๊ฒŒ ์ง€์‹์„ ์ ‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ค‘๊ณ ์ฑ…์„ ์œ„ํ•œ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ์„ ๊ตฌ์ถ•ํ•˜์—ฌ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ๋” ๋‚˜์€ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์„œ๋น„์Šค ๊ธฐ๋Œ€ ํšจ๊ณผ: ์ค‘๊ณ ์ฑ… ๊ฑฐ๋ž˜๋Š” ์นœํ™˜๊ฒฝ ์†Œ๋น„ ๋ฌธํ™”๋ฅผ ํ™•์‚ฐ์‹œํ‚ค๊ณ , ๋…์„œ์™€ ํ•™์Šต์˜ ๊ธฐํšŒ๋ฅผ ํ™•๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ๋ณดํ˜ธ์™€ ์ง€์‹ ๊ณต์œ ๋ฅผ ๊ฒฐํ•ฉํ•œ ์ง€์† ๊ฐ€๋Šฅํ•œ ๋ชจ๋ธ๋กœ ์‚ฌํšŒ์— ๊ธ์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

๐Ÿ”— ์ฃผ์š” ๊ธฐ๋Šฅ

1๏ธโƒฃ ๊ฐ„ํŽธ ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ

  • ์นด์นด์˜ค ์†Œ์…œ ๋กœ๊ทธ์ธ ์—ฐ๋™์œผ๋กœ ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ ์ ˆ์ฐจ ๊ฐ„์†Œํ™”
  • OAuth 2.0 ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐ ๋ณด์•ˆ ๊ฐ•ํ™”

2๏ธโƒฃ ์ •๋ ฌ ๋ฐ ๋ฌดํ•œ ์Šคํฌ๋กค ๋ฆฌ์ŠคํŠธ

  • ๋‹ค์–‘ํ•œ ์ •๋ ฌ(๏ฟฝ๏ฟฝ๏ฟฝ์‹ ์ˆœ, ์ธ๊ธฐ์ˆœ, ๊ฐ€๊ฒฉ์ˆœ ๋“ฑ) ๊ธฐ๋Šฅ ์ œ๊ณต
  • ๋ฌดํ•œ ์Šคํฌ๋กค ๋ฆฌ์ŠคํŠธ๋กœ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ

3๏ธโƒฃ ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฐ ์ฐœ ๊ธฐ๋Šฅ

  • ์ฃผ์š” ๊ฒ€์ƒ‰์–ด ์ฆ๊ฒจ์ฐพ๊ธฐ ๋“ฑ๋ก์œผ๋กœ ๋น ๋ฅธ ๋งค๋ฌผ ํƒ์ƒ‰ ์ง€์›
  • ์ฐœ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๊ด€์‹ฌ ๋งค๋ฌผ์˜ ์ƒํƒœ ์ถ”์  ๊ฐ€๋Šฅ

4๏ธโƒฃ ์•Œ๋ฆผ ์‹œ์Šคํ…œ

  • ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฐ ์ฐœ ๋ชฉ๋ก์— ๋Œ€ํ•œ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์ œ๊ณต
  • ๊ฑฐ๋ž˜ ์ƒํƒœ, ๊ฐ€๊ฒฉ ๋ณ€๋™ ๋“ฑ ์ฃผ์š” ์ด๋ฒคํŠธ ์•Œ๋ฆผ

5๏ธโƒฃ ๋ฐ์‹œ๋ฒจ ๋“ฑ๊ธ‰ ์‚ฌ์šฉ์ž ๋ถ„๋ฅ˜

  • ๊ฑฐ๋ž˜ ํ™œ๋™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ๋ฐ์‹œ๋ฒจ ๋‹จ์œ„๋กœ ๋ถ„๋ฅ˜
  • ์ฑ…์„ ๋ฉ”์ธ ์ฝ˜ํ…์ธ ๋กœ ํ•˜์—ฌ, ๋˜‘๋˜‘ํ•œ ๋™๋ฌผ(๋Œ๊ณ ๋ž˜) ์ปจ์…‰์˜ ๋“ฑ๊ธ‰ ์‹œ์Šคํ…œ ์ ์šฉ

6๏ธโƒฃ ์‚ฌ์šฉ์ž ๊ฐ„ ์ฑ„ํŒ… ๋ฐ ๊ฑฐ๋ž˜ ๊ด€๋ฆฌ

  • ํŒ๋งค์ž์™€ ๊ตฌ๋งค์ž ๊ฐ„ 1:1 ์ฑ„ํŒ… ๊ธฐ๋Šฅ ์ œ๊ณต
  • ๊ฑฐ๋ž˜ ์ƒํƒœ(์ง„ํ–‰, ์™„๋ฃŒ ๋“ฑ) ์ €์žฅ ๋ฐ ๊ด€๋ฆฌ

7๏ธโƒฃ ์ •๊ฐ€ ๋ฐ ๊ฐ€๊ฒฉ ๋น„๊ต

  • ๋„์„œ API ์—ฐ๋™์„ ํ†ตํ•œ ์‹ค์‹œ๊ฐ„ ์ •๊ฐ€ ๋ฐ ์‹œ์„ธ ์ •๋ณด ์ œ๊ณต
  • ๋‹ค์–‘ํ•œ ๋งค๋ฌผ ๊ฐ„ ๊ฐ€๊ฒฉ ๋น„๊ต ๊ธฐ๋Šฅ ์ง€์›

์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜

Image

๐ŸŒˆ ๊ฐœ์„  ์‚ฌํ•ญ

1๏ธโƒฃ ๋‹‰๋„ค์ž„ ์กฐํšŒ ๋ฐฉ์‹ ๊ฐœ์„  -

๐Ÿ“Œ ๋ฌธ์ œ ์ƒํ™ฉ

  • 1๋Œ€1 ์ฑ„ํŒ… ์ง„์ž… ์‹œ, ์‚ฌ์šฉ์ž์˜ member id๋ฅผ ๊ฐ€์ง€๊ณ  ๋‹ค์‹œ ๋‹‰๋„ค์ž„์„ ์กฐํšŒํ•ด์•ผํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ DB ์ ‘๊ทผ์ด ํ•„์š”.
  • ๋งค๋ฒˆ ์ธ์ฆ ๋‹จ๊ณ„์—์„œ ์ถ”๊ฐ€์ ์ธ DB ์ ‘๊ทผ์œผ๋กœ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒ.

โœ… ๊ฐœ์„  ๋ฐฉํ–ฅ

  • token claim์— ์‚ฌ์šฉ์ž ๋‹‰๋„ค์ž„ ์ถ”๊ฐ€ : ์‚ฌ์šฉ์ž์˜ ๋‹‰๋„ค์ž„์„ access token์˜ claim์— ํฌํ•จ์‹œ์ผœ, DB์— ๋Œ€ํ•œ ๋ถˆํ•„์š”ํ•œ ์กฐํšŒ๋ฅผ ์ตœ์†Œํ™”.
  • token ํ—ค๋”์˜ ํฌ๊ธฐ ์ฆ๊ฐ€ ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ : ํ† ํฐ ํ—ค๋”์˜ ํฌ๊ธฐ๋Š” ์•ฝ 31๋ฐ”์ดํŠธ ์ฆ๊ฐ€(920๋ฐ”์ดํŠธ โ†’ 951๋ฐ”์ดํŠธ)ํ–ˆ์ง€๋งŒ, ์ด๋Š” DB ์ ‘๊ทผ์„ ์ค„์ด๋Š” ๊ฒƒ์— ๋น„ํ•ด ๋ฏธ๋ฏธํ•œ ์˜ค๋ฒ„ํ—ค๋“œ.
Image

2๏ธโƒฃ ์ฑ„ํŒ… ๊ธฐ๋Šฅ ๊ณ ๋„ํ™” ( ๋ฉ”์„ธ์ง€ ํ ์ ์šฉ ) -

๐Ÿ“Œ ๋ฌธ์ œ ์ƒํ™ฉ

  • ๋‹จ์ผ ์„œ๋ฒ„์—์„œ ์•ฝ 100๋ช…์˜ ์œ ์ €๊ฐ€ ๋™์‹œ์— 1000๊ฐœ์˜ ๋ฉ”์„ธ์ง€๋ฅผ ๊ฐ™์€ ์ฑ„ํŒ…๋ฐฉ์— ๋ณด๋‚ผ ๊ฒฝ์šฐ, ํŠธ๋ž˜ํ”ฝ ๋ˆ„์ ์œผ๋กœ ์ธํ•œ HTTP 504 Gateway Timeout ๋ฐœ์ƒ

  • ์‘๋‹ต ์‹œ๊ฐ„ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ 0ms๋กœ ๋–จ์–ด์ง€๋ฉฐ ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ํ˜„์ƒ -> ์„œ๋น„์Šค ๋ถˆ๋Šฅ ๋˜๋Š” ์‘๋‹ต ์ง€์—ฐ์œผ๋กœ ํ•ด์„ ๊ฐ€๋Šฅ

    -> http/1.1์˜ ๋ผ์ธ ๋ธ”๋กœํ‚น ๋ฐ stomp ์„ธ์…˜ ๊ด€๋ฆฌ ๋ฐ ๋ฆฌ์†Œ์Šค์˜ ํ•œ๊ณ„๋กœ ์ถ”์ •

image

โœ… ๊ฐœ์„  ๋ฐฉํ–ฅ

  • Netty-Websocket ๋ฐ RabbitMQ๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ ๋ฐ ๊ธฐ๋Šฅ ๋น„๊ต ํ›„ ์„ฑ๋Šฅ ๊ณ ๋„ํ™”

1๏ธโƒฃ Netty-Websocket

  • HTTP/1.1์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ , ๋” ๋‚ฎ์€ ๋ ˆ๋ฒจ์˜ ๋„คํŠธ์›Œํฌ ์ œ์–ด๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ณ ์ž Netty ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WebSocket + STOMP ์„œ๋ฒ„๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ ์‹œ๋„

๐Ÿ“ˆ netty

โ— ๋ฌธ์ œ์ 

  • STOMP ํ”„๋กœํ† ์ฝœ ์ง์ ‘ ๊ตฌํ˜„ ํ•„์š”

    • ๊ธฐ์กด์— ๊ตฌํ˜„๋˜์–ด์žˆ๋Š” ๋ชจ๋“  ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ด๋ฃจ์–ด์ง„ STOMP ํ”„๋กœํ† ์ฝœ ์ง์ ‘ ๊ตฌํ˜„ ํ•„์š”
  • HTTP ํ•ธ๋“œ์…ฐ์ดํฌ -> WebSocket ์—…๊ทธ๋ ˆ์ด๋“œ -> WebSocketFrame -> ByteBuf (STOMP ์ฝ”๋ฑ์šฉ) -> StompFrame (์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์šฉ)์œผ๋กœ ์ด์–ด์ง€๋Š” ์ธ๋ฐ”์šด๋“œ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜๊ณผ ๊ทธ ์—ญ์˜ ์•„์›ƒ๋ฐ”์šด๋“œ ๋ณ€ํ™˜ ๊ณผ์ •์—์„œ์˜ ๋ณต์žก์„ฑ

  • ByteBuf์˜ ์ฐธ์กฐ ์นด์šดํŠธ ๊ด€๋ฆฌ(retain(), release()) ๋ฏธํก์œผ๋กœ ์ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ฐ€๋Šฅ์„ฑ

-> Netty๋Š” ๋†’์€ ์œ ์—ฐ์„ฑ๊ณผ ์„ฑ๋Šฅ ์ž ์žฌ๋ ฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, STOMP์™€ ๊ฐ™์€ ๊ณ ์ˆ˜์ค€ ํ”„๋กœํ† ์ฝœ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋‹นํ•œ ๊ฐœ๋ฐœ ์‹œ๊ฐ„๊ณผ Netty ๋‚ด๋ถ€ ๋™์ž‘์— ๋Œ€ํ•œ ๊นŠ์€ ์ดํ•ด๋ฅผ ์š”๊ตฌํ•จ ํ•™์Šต ๊ณก์„ ์ด ๋งค์šฐ ๊ฐ€ํŒŒ๋ฅด๊ณ , ์•ˆ์ •์ ์ธ ๊ตฌํ˜„๊นŒ์ง€ ๋งŽ์€ ๋””๋ฒ„๊น… ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜์—ฌ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ์ž์›๊ณผ ์ผ์ •์„ ๊ณ ๋ คํ–ˆ์„ ๋•Œ ์‹ค์งˆ์ ์ธ ์„ฑ๋Šฅ ํ–ฅ์ƒ ์ธก์ • ๋‹จ๊ณ„๊นŒ์ง€ ๋‚˜์•„๊ฐ€๊ธฐ ์–ด๋ ค์›€

2๏ธโƒฃ ๋ฉ”์„ธ์ง€ ํ

  • WebSocket/STOMP ํ”„๋กœํ† ์ฝœ ์ž์ฒด๋ฅผ ๋ฐฐ์ œํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์™€ ๏ฟฝ๏ฟฝ๏ฟฝ๋ฒ„๊ฐ€ ๋ฉ”์„ธ์ง€ ํ๋ฅผ ํ†ตํ•ด ์ง์ ‘ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ํ†ต์‹  ์•ˆ์ •์„ฑ ๋ฐ ์„ฑ๋Šฅ ํŠน์„ฑ ํ‰๊ฐ€
  • ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„ ๋ฐ ํ•™์Šต ๊ณก์„ ์„ ๊ณ ๋ คํ•˜๊ณ , DeadLetterQueue ๊ตฌํ˜„์— ์šฉ์ดํ•œ RabbitMQ ์ฑ„ํƒ

**๐Ÿ“ˆ ** image

-> ํ…Œ์ŠคํŠธ ํ”Œ๋กœ์šฐ์ƒ ํ…Œ์ŠคํŠธ ํˆด์ด publish -> consume ๊นŒ์ง€์˜ ์ผ๋ ฌ์˜ ๊ณผ์ •์„ ๋‹ค ๋ฐ›์•„์•ผ ์‘๋‹ต ์‹œ๊ฐ„์ด ์ธก์ •๋˜๊ธฐ์— ์‹ค์ œ ์‹œ๊ฐ„๊ณผ ์ƒ๋‹นํ•œ ์ฐจ์ด ์กด์žฌ

โ— ๋ฌธ์ œ์ 

  • ๊ฐ ์ฑ„ํŒ… ์ฑ„๋„์— ๋Œ€ํ•œ queue ์„ ํƒ ํ•„์š”
    • ํ•œ ์ฑ„ํŒ…๋ฐฉ์— ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋“ค์–ด์˜ฌ ๋•Œ, ์‚ฌ์šฉ์ž์˜ ์ธ์›์ˆ˜ ๋ฐ ์„œ๋ฒ„ ์ŠคํŽ™ ๊ณ ๋ ค ํ•„์š”

** ์„ฑ๋Šฅ ๋น„๊ต **

๊ธฐ์ค€ Netty-WebSocket RabbitMQ
์ตœ๋Œ€ TPS 70K/s (๋‹จ์ผ ์„œ๋ฒ„) 50K/s (๋‹จ์ผ ๋…ธ๋“œ), ํด๋Ÿฌ์Šคํ„ฐ๋ง ์‹œ ํ™•์žฅ
์ง€์—ฐ ์‹œ๊ฐ„ 1ms~3ms 2ms~15ms
์žฅ์•  ๋ณต๊ตฌ ์ˆ˜๋™ ๊ตฌํ˜„ ํ•„์š” DLQ/๋ฏธ๋Ÿฌ๋งํ ์ž๋™ ๋ณต๊ตฌ
๊ฐœ๋ฐœ ๋ณต์žก๋„ ํ”„๋กœํ† ์ฝœ ํ•ธ๋“ค๋Ÿฌ ์ง์ ‘ ๊ตฌํ˜„ ์Šคํ”„๋ง ํ†ตํ•ฉ์œผ๋กœ ์‹ ์† ์ ์šฉ
ํ™•์žฅ์„ฑ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์ถ”๊ฐ€ ํ•„์š” ํด๋Ÿฌ์Šคํ„ฐ ์ž๋™ ํ™•์žฅ
์ตœ์  ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ดˆ์ €์ง€์—ฐ 1:1 ํ†ต์‹  ๋ณต์žกํ•œ ๋ฉ”์‹œ์ง€ ๋ผ์šฐํŒ…/์žฌ์‹œ๋„ ํ•„์š” ์‹œ

๐Ÿ“‰ ๊ฐœ์„  ์ „ image

๐Ÿ“ˆ ๊ฐœ์„  ํ›„ image

๊ฒฐ๋ก 

  • ๋ฉ”์„ธ์ง€ ์ƒํƒœ ์œ ์ง€ ๋ฐ ์ดํ›„ ์‚ฌ์šฉ์ž์™€ ์„œ๋น„์Šค ํ™•์žฅ์— ๋”ฐ๋ฅธ ํ™•์žฅ์„ฑ ์šฉ์ด
  • ๋˜ํ•œ AMPQ (๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋กœํ† ์ฝœ)์„ ์‚ฌ์šฉํ•˜์—ฌ text ๊ธฐ๋ฐ˜์˜ Stomp๋ณด๋‹ค ์ž‘์€ ํฌ๊ธฐ
  • ๋ฉ”์„ธ์ง€๋ฅผ ์‚ฌ์šฉํ•œ ๋น„๋™๊ธฐ ๋กœ์ง์œผ๋กœ์„œ ์ดํ›„ ์„œ๋ฒ„ ๋ถ„๋ฆฌ์‹œ ์˜์กด์„ฑ ๋‚ฎ์ถ”๊ณ  ๊ฒฐํ•ฉ์„ฑ ๋†’์ด๊ธฐ ์šฉ์ด

-> ๋ฉ”์„ธ์ง€ ํ๋ฅผ ํ†ตํ•œ ์ฑ„ํŒ… ์„œ๋น„์Šค๋กœ ๋ณ€๊ฒฝ

Popular repositories Loading

  1. be be Public

    Java 1

  2. fe fe Public

    JavaScript

  3. .github .github Public

Repositories

Showing 3 of 3 repositories

People

This organization has no public members. You must be a member to see whoโ€™s a part of this organization.

Top languages

Loadingโ€ฆ

Most used topics

Loadingโ€ฆ