[Netty] Netty๋กœ ๋ฐฐ์›Œ๋ณด๋Š” Non-blocking I/O ๊ธฐ์ดˆ

๋ฐ˜์‘ํ˜•

์˜ค๋Š˜์€ Java ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฝƒ์ธ Netty์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

What is Netty ?

Netty๋ฅผ ๋“ค์–ด๋ณด์‹  ๋ถ„๋“ค์ด๋ผ๋ฉด ์•„๋งˆ ํ•œ ๋ฒˆ ์ฏค c10k ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ๊ฒฝํ—˜ํ•ด๋ณด์…จ๊ฑฐ๋‚˜ ๊ด€์‹ฌ์„ ๊ฐ€์กŒ์„๋งŒํ•œ ๋ถ„์ด์‹ค ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Netty๋Š” JVM์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Java NIO ๊ธฐ๋ฐ˜์˜ Non-blocking ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์–ด๋Š ํŠน์ • ํ”„๋กœํ† ์ฝœ(HTTP ๋“ฑ)์˜ ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ TCP, UDP์˜ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ Non-blocking I/O๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

 

Non-blocking์ด ๋ฌด์—‡์ธ๊ฐ€์š”? ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด, ์–ด๋– ํ•œ ์ž‘์—…์„ ๋ง‰ํž˜์—†์ด ์ด์–ด๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

 

๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ž๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๋ง›์žˆ๋Š” ๋ง›์ง‘์—๊ฐ€์„œ ์Œ์‹์„ ๋จน์œผ๋Ÿฌ ๊ฐ”์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์Œ์‹์„ ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ์ด ์ฃผ๋ฌธ๋„ ๋ฐ›๊ณ , ๊ฒฐ์ œ๋„ ํ•˜๊ณ  ์š”๋ฆฌ๋„ ํ•œ๋‹ค๋ฉด? ๊ทธ๋Ÿฌ๋ฉด ํ•œ ์‚ฌ๋žŒ์ด ๋ชจ๋“  ์ผ์„ ๋‹ค ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋ฌธ์„ ๋ฐ›๋‹ค๊ฐ€๋„ ์Œ์‹๋„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ณ , ๊ฒฐ์ œ๋„ ํ•˜๋Š” ๋“ฑ ์ค‘๊ฐ„ ์ค‘๊ฐ„์˜ ์ผ๋“ค์ด ์ˆœ์ฐจ์ ์œผ๋กœ ๋ง‰ํžˆ๋ฉด์„œ ์ž‘์—…์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌ๋ฉด ์ผ์ด ๋นจ๋ฆฌ ์ง„ํ–‰๋˜์ง€ ๋ชปํžˆ์ฃ .

 

๊ทธ๋ž˜์„œ ์ฃผ๋ฌธ๋ฐ›๋Š” ์‚ฌ๋žŒ, ๊ฒฐ์ œ๋ฐ›๋Š” ์‚ฌ๋žŒ, ์Œ์‹ ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ์„ ๋ณ„๋„๋กœ ๋‘์–ด, ์ฃผ๋ฌธ์ด๋ผ๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์„ ๋ง‰ํž˜์—†์ด ์ง„ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ์ปดํ“จํ„ฐ์—์„œ๋Š” Non-blocking์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

Netty๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ

์ €๋Š” JVM ์–ธ์–ด๋กœ ๋ณดํ†ต ์ฝ”ํ‹€๋ฆฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด Java์˜ Thread์™€ Kotlin Extension์˜ Coroutine์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

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

 

Java์˜ NIO๋Š” Java์—์„œ ๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ์„ ์ง€์›ํ•ด์ฃผ๋Š” ํŒจํ‚ค์ง€๋กœ ๊ณผ๊ฑฐ IO์—์„œ๋Š” ์ž…์ถœ๋ ฅ์„ ์ŠคํŠธ๋ฆผ(Stream)๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด NIO๋Š” ์ฑ„๋„(Channel)์„ ์ด์šฉํ•ด ์ž…์ถœ๋ ฅ์„ ์ง„ํ–‰ํ•˜์—ฌ Blocking ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Non-blocking๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฒŒ๋‹ค๊ฐ€ NIO์˜ Non-blocking์˜ ํ•ต์‹ฌ ๊ฐ์ฒด๋Š” ๋ฉ€ํ‹ฐํ”Œ๋ ‰์„œ(Multiplexor)์™€ ์…€๋ ‰ํ„ฐ(Selector)๋กœ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ ์™„๋ฃŒ๋œ ์ฑ„๋„์„ ์„ ํƒํ•˜์—ฌ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ๋„ ๋‹ค์ค‘ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๊ณ ์˜ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์ž์„ธํ•œ ์ด์•ผ๊ธฐ๋Š” ์•„๋ž˜์˜ ๋ธ”๋กœ๊ทธ์—์„œ ์ข€ ๋” ์ž์„ธํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.(https://dev-coco.tistory.com/42)

 

 

 

Netty Architecture

Netty ์•„ํ‚คํ…์ฒ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ SEDA(Staged Event-Driven Architecture)๋ฅผ ๊ธฐ๋ฐ˜์˜ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ด์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฝ”์–ด ๋ถ€๋ถ„์„ ๋ณด๋ฉด ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ด๋ฒคํŠธ ๋ชจ๋ธ๊ณผ ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ์„ ์ง€์›์„ ์œ„ํ•œ ์ฝ”๋ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Netty๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ†ตํ•ด ๊ฐ์ฒด์— ์ด๋ฒคํŠธ๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ง„ํ–‰ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ Java NIO Non-blocking ์†Œ์ผ“์˜ Selector๋ฅผ ์ด์šฉํ•œ ๋ฐฉ์‹์ด๋ฉฐ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๋‚ด์— Selector๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋™์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

Selector๋ฅผ ๋ชจ๋ฅด๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์ž ๊น ์„ค๋ช…๋“œ๋ฆฌ๋ฉด, ๋ธ”๋กœํ‚น ์†Œ์ผ“์„ ์ด์šฉํ•ด ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ–ˆ์„ ๋•Œ ๋‹ค์ˆ˜ ์œ ์ €์˜ ์š”์ฒญ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ์œ„์™€ ๊ฐ™์ด ์†Œ์ผ“ ํ•˜๋‚˜๋‹น ์Šค๋ ˆ๋“œ๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์†Œ์ผ“์ด Blocking์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ์œ ์ €๊ฐ€ ๊ทธ ์†Œ์ผ“์„ ๋ฌผ๊ณ  ์žˆ๋Š” ๋™์•ˆ์€ ๋™์‹œ์˜ ์ผ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ Selector๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๋‚ด์— Selector ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋‹ด์€ ์†Œ์ผ“์„ Selector์— ๋„ฃ๊ณ  ์ด๋ฒคํŠธ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ์ด ๊ด€๋ฆฌ ๊ฐ์ฒด๋ฅผ Java NIO์˜ ์ฑ„๋„(Channel)์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์‹ค์ œ๋กœ Java NIO์—์„œ๋Š” ServerSocketChannel, SocketChannel์„ ๋…ผ๋ธ”๋กœํ‚น ์†Œ์ผ“์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ๋“ค์–ด์™”์Œ์„ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด OP_ACCEPT๋ผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

 

Netty๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

Java NIO๋Š” Non-blocking I/O๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ์ฝ”์–ด์— ์†ํ•˜์ง€๋งŒ ๊ทธ ์‚ฌ์šฉ๋ฒ•์€ ๊ธฐ๋ณธ์ ์ธ ๋„คํŠธ์›Œํฌ ์ง€์‹๊ณผ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฒฝํ—˜์ด ์—†๋‹ค๋ฉด ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ์ง€์‹์„ ์ž์„ธํžˆ ์•Œ์ง€ ์•Š์•„๋„ ์ตœ๋Œ€ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐœํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ Netty ์ž…๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ NIO๋ฅผ ์ด์šฉํ•ด Non-blocking ์†Œ์ผ“์„ ์ด์šฉํ•˜์—ฌ HTTP ์›น ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. TCP ์†Œ์ผ“์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์•„๋ž˜์˜ ๊ณผ์ •์„ ์ผ๊ด„์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

  • ์‚ฌ์šฉํ•  ์†Œ์ผ“์„ ํ•™์Šต ๋ฐ ๊ตฌํ˜„ (NIO ServerSocketChannel, Selector)
  • accept ์ด๋ฒคํŠธ ์ •์˜
  • HTTP Header, body์˜ ์š”์ฒญ์„ ๋ฐ›์•„๋‚ผ ๋ฒ„ํผ ์ •์˜, ์‘๋‹ต ํ—ค๋” ๋ฐ ๋ฐ”๋””์˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ •์˜

Netty๋Š” Spring์ฒ˜๋Ÿผ ์ด๋Ÿฌํ•œ ์ผ๋ จ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋กœ์จ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํ† ์ฝœ์— ํ•„์š”ํ•œ ์ฝ”๋ฑ์„ ์ œ๊ณตํ•˜๊ณ  ์†Œ์ผ“์„ ์ƒ์„ฑํ•˜๋Š” ๋“ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์™ธ์— ํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‰ฝ๊ฒŒ ํ•˜๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

 

 

 

Netty's core components

์šฐ๋ฆฌ๋Š” Netty๋กœ Non-blocking I/O ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 

 

  • Channels
  • Callbacks
  • Future
  • Events and handlers

 

์ž์„ธํžˆ ๋ณด๋ฉด JDK 8์—์„œ ์ œ๊ณตํ•˜๋Š” API๋“ค์ž…๋‹ˆ๋‹ค. ์ฐจ๋ก€๋กœ ์‚ดํŽด๋ณด๋ฉด Channel์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋“œ์›จ์–ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” I/O ์‹ ํ˜ธ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” NIC์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋„คํŠธ์›Œํฌ์˜ ์š”์ฒญ/์‘๋‹ต ์‹ ํ˜ธ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

Callback์€ ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์ด์•ผ๊ธฐํ•˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ด์•ผ๊ธฐ ํ•ฉ๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ์— ๋Œ€ํ•ด ์–ด๋ ค์›Œํ•˜์‹œ๋Š” ๋ถ„๋“ค์ด ๋งŽ์œผ์‹ ๋ฐ, ์ฝœ๋ฐฑ์€ ๋‹จ์ˆœํžˆ ๋ฉ”์„œ๋“œ์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์šฐ๋ฆฌ๊ฐ€ ํ•จ์ˆ˜์— ๊ทธ ์ธ์ž๋ฅผ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ ์ด๋ฅผ ํ†ตํ•ด ์ „์ž์˜ ํ•จ์ˆ˜๊ฐ€ ํ›„์ž์˜ ํ•จ์ˆ˜๋ฅผ ์ ์ ˆํ•œ ์‹œ๊ฐ„์— ํ˜ธ์ถœํ•œ๋‹ค๋Š” ํŠน์„ฑ์„ ์ด์šฉํ•˜ ๊ฒƒ ๋ฟ์ž…๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ์ ์ ˆํ•œ ์‹œ๊ฐ„์ด๋ž€, ํ›„์ž์˜ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๊ธฐ ์ „์— ์ „์ž์˜ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋  ์ˆ˜ ์—†์Œ์„ ์ด์•ผ๊ธฐ ํ•ฉ๋‹ˆ๋‹ค. ํ›„์ž์˜ ํ•จ์ˆ˜๊ฐ€ I/O wait ์ƒํƒœ์ธ ๊ฒฝ์šฐ ๊ทธ๋ฅผ ์ข…๋ฃŒํ•  ์‹œ๊ฐ„์„ ์‘๋‹ตํ•ง ๋•Œ๊นŒ์ง€๋กœ ํ•  ๊ฒƒ์ธ๊ฐ€, ์•„๋‹ˆ๋ฉด ํŠน์ • ์‹œ๊ฐ„์„ ์ •ํ•ด๋†“์„ ๊ฒƒ์ธ๊ฐ€๋Š” ๊ฐœ๋ฐœ์ž์˜ ํŒ๋‹จ์ธ ๊ฒƒ์ด์ฃ . Non-blocking I/O์— ์žˆ์–ด์„œ ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด Blocking I/O๋Š” ์„œ๋ฒ„์—์„œ ์‘๋‹ตํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์† ๊ธฐ๋‹ค๋ฆฌ์ง€๋งŒ Non-blocking I/O๋Š” ์„œ๋ฒ„์—์„œ ์‘๋‹ตํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

Netty์—์„œ๋Š” ์ด๋Ÿฐ ์ฝœ๋ฐฑ์„ ChannelHandler๋ผ๋Š” ์ด๋ฆ„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฐจํ›„ ํฌ์ŠคํŠธ์—์„œ Netty์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณผ ๋•Œ ์ž์„ธํžˆ ์ด์•ผ๊ธฐ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Futures๋Š” JDK 8์—์„œ ์ œ๊ณตํ•˜๋Š” ๋น„๋™๊ธฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. Javascript์˜ Promise์™€ ์œ ์‚ฌํ•˜๋ฉฐ ์‘๋‹ต์„ ์ง€๊ธˆ ๋ฐ”๋กœ ํ•˜์ง€ ์•Š๊ณ , "์–ธ์  ๊ฐ€ ์‘๋‹ต ํ•ด์ค„๊ฒŒ"๋ผ๋Š” ์˜๋ฏธ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

Netty์—์„œ๋Š” ChannelFuture๋ผ๋Š” ๋ณ„๋„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์‚ฌ์‹ค์ƒ JDK 8์˜ Future๋ฅผ ์ด์šฉํ•œ ๊ฒƒ์ธ๋ฐ, ๊ธฐ๋ณธ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์กฐ์—์„œ๋Š” ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ™•์ธํ•ด์•ผํ•˜๊ฑฐ๋‚˜, ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ blocking ํ•ด์•ผํ•˜๋Š” ๋งค์ปค๋‹ˆ์ฆ˜๋งŒ ์ œ๊ณตํ•˜๋Š” ๋ถˆํŽธํ•จ์— Netty์—์„œ๋Š” ์ž์ฒด์ ์œผ๋กœ ChannelFuture ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„๋„ ์ฐจํ›„ ํฌ์ŠคํŠธ์—์„œ ์ž์„ธํžˆ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ Events and handlers๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ์ด์•ผ๊ธฐ ํ•ด์™”๋˜ Selector์˜ ์ด๋ฒคํŠธ์™€๋Š” ์กฐ๊ธˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ฐ™์€ ์ด๋ฒคํŠธ๊ธด ํ•˜์ง€๋งŒ Netty ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ ์ž์ฒด์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ด๋ฒคํŠธ๋ฅผ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€๋ น ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์— ์„ฑ๊ณต/์‹คํŒจ, ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•œ ์š”์ฒญ ์„ฑ๊ณต/์‹คํŒจ, ์‘๋‹ต ์„ฑ๊ณต/์‹คํŒจ ๋“ฑ ๋„คํŠธ์›Œํฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์ด์•ผ๊ธฐ ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

๋งˆ์น˜๋ฉฐ...

์—ฌ๊ธฐ๊นŒ์ง€ Netty๋กœ Non-blocking I/O์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ดค์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์— Netty๋ฅผ ๋งŒ์ง€๊ฒŒ ๋˜๋ฉด์„œ Callback์˜ ์•„ํ””์„ ๊ฒช์–ด์•ผ ํ•˜๋Š” ๊ณ ํ†ต์ด ์ด๋ฃจ ๋งํ•  ์ˆ˜ ์—†์ง€๋งŒ ๋‹ค์‹œ๊ธˆ ๋…ผ๋ธ”๋กœํ‚น I/O์™€ c10k ์ด์Šˆ๋ฅผ ๋‹ค๋ฃจ๋ฉด์„œ ์žŠ์—ˆ๋˜ CS ์ง€์‹์„ ๋– ์˜ฌ๋ฆฌ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์žฌ๋ฏธ๋ฅผ ๋Š๋ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ๋Š” Netty์˜ ์ฃผ์š” API๋ฅผ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments