Eventloop& Thread Model
7.1 Threading model overview
์ค๋ ๋ ๋ชจ๋ธ์ OS, ํ๋ก๊ทธ๋๋ฐ ์ธ์ด, ํ๋ ์์ํฌ, ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋งฅ๋ฝ์์ ์ค๋ ๋ ๊ด๋ฆฌ์ ์ค์ํ ์ธก๋ฉด์ ์ง์ ํฉ๋๋ค. ์ค๋ ๋๊ฐ ์์ฑ๋๋ ๋ฐฉ์๊ณผ ์๊ธฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ ์คํ์ ํฐ ์ํฅ์ ๋ฏธ์น๋ฏ๋ก, ๊ฐ๋ฐ์๋ ๋ค์ํ ๋ชจ๋ธ์ ์ฅ๋จ์ ์ ์ดํดํด์ผ ํฉ๋๋ค.
7.1.1 ์ค๋ ๋ ๋ชจ๋ธ ๊ฐ์
์ค๋ ๋ ๋ชจ๋ธ์ ์ฝ๋๊ฐ ์คํ๋๋ ๋ฐฉ์์ ์ง์ ํฉ๋๋ค. ๋์ ์คํ์ ๊ฐ๋ฅํ ๋ถ์์ฉ์ ํญ์ ๊ฒฝ๊ณํด์ผ ํ๋ฏ๋ก, ์ ์ฉ๋๋ ๋ชจ๋ธ์ ์ํฅ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค
๋ค์ค ์ฝ์ด ๋๋ CPU๋ฅผ ๊ฐ์ง ์ปดํจํฐ๊ฐ ๋ณดํธํ๋จ์ ๋ฐ๋ผ ๋๋ถ๋ถ์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์คํ ์์์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ์ ๊ตํ ๋ฉํฐ์ค๋ ๋ฉ ๊ธฐ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ธ ์ค๋ ๋ ํ๋ง ํจํด์ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํ ์ ์์ต๋๋ค:
์ค๋ ๋ ํ์ ์์ ๋ชฉ๋ก์์ ์ค๋ ๋๊ฐ ์ ํ๋์ด ์ ์ถ๋ ์์ (Runnable ๊ตฌํ)์ ์คํํฉ๋๋ค.
์์ ์ด ์๋ฃ๋๋ฉด ์ค๋ ๋๋ ๋ชฉ๋ก์ผ๋ก ๋ฐํ๋์ด ์ฌ์ฌ์ฉ ๊ฐ๋ฅํด์ง๋๋ค.
7.2 Interface EventLoop
์ฐ๊ฒฐ์ ์๋ช ๋์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ์์ ์ ์คํํ๋ ๊ฒ์ ๋ชจ๋ ๋คํธ์ํน ํ๋ ์์ํฌ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๋๋ค.
์ด์ ๊ด๋ จ๋ ํ๋ก๊ทธ๋๋ฐ ๊ตฌ์กฐ๋ ์ข
์ข
์ด๋ฒคํธ ๋ฃจํ๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ,
Netty๋ ์ด ์ฉ์ด๋ฅผio.netty.channel.EventLoop
์ธํฐํ์ด์ค๋ก ์ฑํํ๊ณ ์์ต๋๋ค.
Netty์ EventLoop๋ ๋ ๊ฐ์ง ๊ธฐ๋ณธ API(๋์์ฑ ๋ฐ ๋คํธ์ํน)๋ฅผ ์ฌ์ฉํ๋ ํ๋ ฅ์ ์ค๊ณ์ ์ผ๋ถ์ ๋๋ค.
io.netty.util.concurrent ํจํค์ง๋ JDK ํจํค์ง java.util.concurrent๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค๋ ๋ ์คํ๊ธฐ๋ฅผ ์ ๊ณต
io.netty.channel ํจํค์ง์ ํด๋์ค๋ Channel ์ด๋ฒคํธ์ ์ธํฐํ์ด์ค๋ฅผ ํ์ฅํฉ๋๋ค.
์ด ๋ชจ๋ธ์์ EventLoop๋ ๋ณ๊ฒฝ๋์ง ์๋ ํ๋์ ์ค๋ ๋์ ์ํด ๊ตฌ๋๋๋ฉฐ, ์ฆ์ ๋๋ ์์ฝ๋ ์คํ์ ์ํด EventLoop ๊ตฌํ์ ์ง์ ์ ์ถํ ์ ์๋ ์์ (Runnable ๋๋ Callable)์ ์คํํฉ๋๋ค.
๊ตฌ์ฑ๊ณผ ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ์ด์ ๋ฐ๋ผ ์ฌ๋ฌ EventLoop๊ฐ ์์ฑ๋ ์ ์์ผ๋ฉฐ, ๋จ์ผ EventLoop๊ฐ ์ฌ๋ฌ Channel์ ์๋น์คํ ์ ์์ต๋๋ค.
7.3 Task scheduling
๋๋๋ก ์์ ์ ๋์ค์(์ง์ฐ๋) ๋๋ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํํ๋๋ก ์์ฝํด์ผ ํ ํ์๊ฐ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ์๊ฒฉ ํผ์ด์ ํํธ๋นํธ ๋ฉ์์ง๋ฅผ ๋ณด๋ด ์ฐ๊ฒฐ์ด ์ฌ์ ํ ์ด์ ์๋์ง ํ์ธํ๋ ๊ฒ์ ๋๋ค.
7.3.1 JDK scheduling API
newScheduledThreadPool(int corePoolSize)
๋ช
๋ น์ ์ง์ฐ ํ ์คํํ๊ฑฐ๋ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํํ ์ ์๋ ScheduledThreadExecutorService
๋ฅผ ์์ฑํฉ๋๋ค. ์ธ์ corePoolSize
๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ ๋ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)
๋ช
๋ น์ ์ง์ฐ ํ ์คํํ๊ฑฐ๋ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํํ ์ ์๋ ScheduledThreadExecutorService
๋ฅผ ์์ฑํฉ๋๋ค.
newSingleThreadScheduledExecutor()
ํ๋์ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ฝ๋ ์์ ์ ์คํํฉ๋๋ค.
newSingleThreadScheduledExecutor(ThreadFactory threadFactory)
ํ๋์ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ฝ๋ ์์ ์ ์คํํฉ๋๋ค.
ScheduledExecutorService
๋ฅผ ์ฌ์ฉํ์ฌ 60์ด ํ์ ์์
์ ์คํํ๋ ๋ฐฉ๋ฒ
ScheduledExecutorService
API๋ ์ง๊ด์ ์ด์ง๋ง, ๋ถํ๊ฐ ๋์ ์ํฉ์์๋ ์ฑ๋ฅ ๋น์ฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
7.3.2 Scheduling tasks using EventLoop
ScheduledExecutorService
๊ตฌํ์ ํ ๊ด๋ฆฌ์ ์ผ๋ถ๋ก ์ถ๊ฐ ์ค๋ ๋๋ฅผ ์์ฑํ๋ ๋ฑ์ ํ๊ณ๊ฐ ์์ต๋๋ค.
Netty๋ ์ฑ๋์ EventLoop๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
Netty์ EventLoop๋ ScheduledExecutorService
๋ฅผ ํ์ฅํ๋ฏ๋ก, JDK ๊ตฌํ์์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ๋ฉ์๋(schedule()
, scheduleAtFixedRate()
๋ฑ)๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋น๋๊ธฐ ์์
๋ง๋ค ๋ฐํ๋๋ ScheduledFuture
๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ์ํ๋ฅผ ์ทจ์ํ๊ฑฐ๋ ํ์ธํ ์ ์์ต๋๋ค.
7.4 Implementation details
7.4.1 Thread management
Netty์ ์ค๋ ๋ฉ ๋ชจ๋ธ์ ๋ฐ์ด๋ ์ฑ๋ฅ์ ํ์ฌ ์คํ ์ค์ธ ์ค๋ ๋์ ์๋ณ์ ๋ฌ๋ ค ์์ต๋๋ค. ์ฆ, ํธ์ถ ์ค๋ ๋๊ฐ ํ์ฌ ์ฑ๋๊ณผ ๊ทธ EventLoop์ ํ ๋น๋ ์ค๋ ๋์ธ์ง ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
ํธ์ถ ์ค๋ ๋๊ฐ EventLoop์ ์ค๋ ๋์ธ ๊ฒฝ์ฐ, ํด๋น ์ฝ๋ ๋ธ๋ก์ด ์ง์ ์คํ๋ฉ๋๋ค. EventLoop๋ ๋์ค์ ์คํ๋ ์์ ์ ์์ฝํ๊ณ ๋ด๋ถ ํ์ ๋ฃ์ต๋๋ค.
๊ฐ EventLoop๋ ๋ค๋ฅธ EventLoop์ ๋ ๋ฆฝ์ ์ธ ์์ฒด ์์ ํ๋ฅผ ๊ฐ์ต๋๋ค.
7.4.2 EventLoop/thread allocation
์ฑ๋์ ์ํ I/O ๋ฐ ์ด๋ฒคํธ๋ฅผ ์๋น์คํ๋ EventLoop๋ EventLoopGroup์ ํฌํจ๋ฉ๋๋ค. EventLoop๊ฐ ์์ฑ๋๊ณ ํ ๋น๋๋ ๋ฐฉ์์ ์ ์ก ๊ตฌํ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
ASYNCHRONOUS TRANSPORTS
๋น๋๊ธฐ ๊ตฌํ์ ์์์ EventLoop(๋ฐ ๊ด๋ จ ์ค๋ ๋)๋ง ์ฌ์ฉํ๋ฉฐ, ํ์ฌ ๋ชจ๋ธ์์๋ ์ฑ๋ ๊ฐ์ ๊ณต์ ๋ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ ์ฑ๋์ ์ค๋ ๋๋ฅผ ํ ๋นํ๋ ๋์ , ๊ฐ๋ฅํ ์ต์ํ์ ์ค๋ ๋ ์๋ก ๋ง์ ์ฑ๋์ ์๋น์คํ ์ ์๊ฒ ํฉ๋๋ค.
EventLoopGroup์ ์๋ก ์์ฑ๋ ๊ฐ ์ฑ๋์ EventLoop๋ฅผ ํ ๋นํ ์ฑ ์์ด ์์ต๋๋ค.
Last updated
Was this helpful?