Netty & EventLoop
Spring WebFlux๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ ์๋ฒ๋ก Netty๋ฅผ ์ฌ์ฉํ๋ค.
Netty๋ ๊ณ ์ฑ๋ฅ ๋คํธ์ํฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๊ธฐ ์ํ ๋น๋๊ธฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ ํ๋ ์์ํฌ
WebFlux๊ฐ ์งํฅํ๋ ๋ ผ๋ธ๋กํน(Non-Blocking) I/O ๋ชจ๋ธ์ ๊ฐ์ฅ ํจ์จ์ ์ผ๋ก ๊ตฌํํ๋ ํต์ฌ ๊ธฐ์
Netty
๋คํธ์ํฌ ํ๋ ์์ํฌ: TCP/UDP ์์ผ๊ณผ ๊ฐ์ ์ ์์ค(low-level) ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ์ ์ถ์ํํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์ค ๊ฐ๋ฅ
์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ฐ ๋น๋๊ธฐ: ๋ชจ๋ I/O ์์ (์ฐ๊ฒฐ ์๋ฆฝ, ๋ฐ์ดํฐ ์์ ๋ฑ)์ ์ด๋ฒคํธ๋ก ๊ฐ์ฃผ
์์ ์ด ์๋ฃ๋๋ฉด ์ฝ๋ฐฑ์ ํตํด ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ๋์
์ด๋ก ์ธํด ์์ ์ด ์งํ๋๋ ๋์ ์ค๋ ๋ ์ฐจ๋จ ์์ด ๋ค๋ฅธ ์์ ์ํ ๊ฐ๋ฅ
์ ์ ์์ ์ค๋ ๋๋ก ์๋ง์ ๋์ ์ฐ๊ฒฐ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ Netty์ ํน์ฑ์ WebFlux์ ๋ฆฌ์กํฐ๋ธ ๋ชจ๋ธ๊ณผ ์๋ฒฝํ๊ฒ ๋ถํฉํ์ฌ ๋ด์ฅ ์๋ฒ๋ก ์ฑํ๋์๋ค.
์ด๋ฒคํธ ๋ฃจํ ๊ธฐ๋ฐ์ ๋น๋๊ธฐ ๋์ ์๋ฆฌ
Netty์ ํต์ฌ์ ์ด๋ฒคํธ ๋ฃจํ(Event Loop) ๋ชจ๋ธ๋ก, ์ฑ๋ฅ์ ํต์ฌ ์ญํ ์ ํ๋ค.
์ด๋ฒคํธ ๋ฃจํ(Event Loop)
๋ฌดํ ๋ฃจํ๋ฅผ ๋๋ฉด์ ์์ ์๊ฒ ํ ๋น๋ ์ฑ๋(Channel, ํด๋ผ์ด์ธํธ์์ ์ฐ๊ฒฐ)์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ณ ์ฒ๋ฆฌํ๋ ์ค๋ ๋ ํ ๋น
Netty ์๋ฒ๋ ๋ณดํต CPU ์ฝ์ด ์์ ๋ง์ถฐ ์์์ ์ด๋ฒคํธ ๋ฃจํ ์ค๋ ๋๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉ
ํ๋์ ์ด๋ฒคํธ ๋ฃจํ ์ค๋ ๋๋ ํ๋ ์ด์์ ์ฑ๋์ ๋ด๋นํ๋ฉฐ, ํด๋น ์ฑ๋๋ค์์ ๋ฐ์ํ๋ ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌ
๋์ ๊ณผ์
์ด๋ฒคํธ ๋ฃจํ๋ ์์ ์๊ฒ ํ ๋น๋ ์ฑ๋๋ค์ ๊ณ์ํด์ ํ์ธํ๋ฉฐ ์ด๋ฒคํธ ๋ฐ์์ ๊ฐ์
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด(์: ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ดํฐ ์์ ), ์ด๋ฒคํธ ํ(Task Queue)์ ํด๋น ์์ ์ ๋ฑ๋ก
์ด๋ฒคํธ ๋ฃจํ๋ ํ์์ ์์ ์ ํ๋์ฉ ๊บผ๋ด ๋ฑ๋ก๋ ํธ๋ค๋ฌ(Handler, ๊ฐ๋ฐ์๊ฐ ์์ฑํ ๋ก์ง)๋ฅผ ์คํ
ํธ๋ค๋ฌ์ ์คํ์ ๋งค์ฐ ์งง์ ์๊ฐ ์์ ๋๋์ผ ํ๋ฉฐ, ์ ๋ ๋ธ๋กํน(Blocking) ์์ ์ ํฌํจํด์๋ ์ ๋จ
์์ ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด ์ด๋ฒคํธ ๋ฃจํ๋ ๋ค์ ์ฑ๋๋ค์ ๊ฐ์ํ๋ ์ํ๋ก ๋ณต๊ท
ํต์ฌ ์์น
ํ๋์ ์ด๋ฒคํธ ๋ฃจํ ์ค๋ ๋๊ฐ ์๋ง์ ์ฐ๊ฒฐ์ ๋์์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์, ๋ง์ฝ ํ๋์ ์์ ์์ ์ค๋ ๋๊ฐ ๋ฉ์ถ๋ฉด(block) ํด๋น ์ค๋ ๋์ ํ ๋น๋ ๋ค๋ฅธ ๋ชจ๋ ์ฐ๊ฒฐ์ ์์ ์ฒ๋ฆฌ๋ ๋ธ๋กํน
๋๋ฌธ์ ๋ธ๋กํน ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ์ ๋
subscribeOn(Schedulers.boundedElastic())์ ์ฌ์ฉํ์ฌ ์์ ์ ์ด๋ฒคํธ ๋ฃจํ ์ค๋ ๋๊ฐ ์๋ ๋ค๋ฅธ ์ค๋ ๋๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ค์
Netty์ ์ค๋ ๋ ๊ตฌ์กฐ
์ค์ Netty๋ ์ค๋ ๋๋ณ๋ก ์ญํ ์ ๋ถ๋ฆฌํ์ฌ ํจ์จ์ฑ์ ๊ทน๋ํํ๋ค.
Boss ๊ทธ๋ฃน
๋ณดํต ๋จ์ผ ์ค๋ ๋๋ก ๊ตฌ์ฑ
์ค์ง ์๋ฒ ํฌํธ๋ฅผ ๋ฐ์ธ๋ฉํ๊ณ ํด๋ผ์ด์ธํธ์ ์๋ก์ด ์ฐ๊ฒฐ ์์ฒญ์ ์๋ฝ(accept)ํ๋ ์ญํ ๋ง ๋ด๋น
์๋ก์ด ์ฐ๊ฒฐ์ด ์๋ฆฝ๋๋ฉด, ํด๋น ์ฐ๊ฒฐ(์ฑ๋)์ Worker ๊ทธ๋ฃน์ ์ด๋ฒคํธ ๋ฃจํ ์ค ํ๋์ ๋ฑ๋กํ๊ณ ์์ ์ ์ฆ์ ๋ค์ ์ฐ๊ฒฐ์ ๋ฐ๊ธฐ ์ํด ๋๊ธฐ
Worker ๊ทธ๋ฃน
CPU ์ฝ์ด ์์ ๋ง์ถฐ ์์ฑ๋ ์ฌ๋ฌ ๊ฐ์ ์ด๋ฒคํธ ๋ฃจํ ์ค๋ ๋๋ก ๊ตฌ์ฑ
Boss ๊ทธ๋ฃน์ผ๋ก๋ถํฐ ๋๊ฒจ๋ฐ์ ์ฑ๋์์ ๋ฐ์ํ๋ ๋ชจ๋ I/O ์ด๋ฒคํธ(๋ฐ์ดํฐ ์ฝ๊ธฐ, ์ฐ๊ธฐ ๋ฑ) ์ฒ๋ฆฌ
์ค์ง์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๋น์ฆ๋์ค ๋ก์ง์ด ์คํํ๋ ์ค๋ ๋
์ด๋ฌํ ๊ตฌ์กฐ ๋๋ถ์ ์ฐ๊ฒฐ ์๋ฝ๊ณผ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ๋ถ๋ฆฌ๋์ด, ๊ฐ์์ ์ญํ ์๋ง ์ง์คํจ์ผ๋ก์จ ์์คํ ์ ์ฒด์ ์ฑ๋ฅ์ ๋์ผ ์ ์๋ค.
๋ฆฌ์กํฐ๋ธ ๋ชจ๋ธ์ ๋ณ๋ชฉ ์ง์ ๊ณผ ๊ณผ๋ถํ ๊ด๋ฆฌ
๋ ผ๋ธ๋กํน ๋ชจ๋ธ์ ๋ธ๋กํน ๋ชจ๋ธ์ ์ค๋ ๋ ๊ณ ๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ง, ๋ณ๋ชฉ ์ง์ ์ด ์ค๋ ๋ ํ์ ํฌ๊ธฐ์์ CPU์ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ๋ค๋ฅธ ์์คํ ์์์ผ๋ก ์ ํ๋ ๋ฟ์ด๋ค.
๋ณ๋ชฉ ํจ๋ฌ๋ค์์ ์ ํ
๋ธ๋กํน ๋ชจ๋ธ (Thread-per-Request)
ํ๊ณ์ : ๋์ ์์ฒญ ์๊ฐ ์ค๋ ๋ ํ์ ๊ฐ์ฉ ์ค๋ ๋ ์์ ์ํด ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ ํ
๋ณ๋ชฉ ํ์
I/O ๋๊ธฐ ์ํ์ ์ค๋ ๋๊ฐ ์ฆ๊ฐํ๋ฉด์ ์์(ํนํ ๋ฉ๋ชจ๋ฆฌ)์ ์๋ชจ๋์ง๋ง, ์ค์ ์์ ์ ์ฒ๋ฆฌ๋์ง ์์
๊ฐ์ฉ ์ค๋ ๋๊ฐ ๊ณ ๊ฐ๋๋ฉด ์๋ก์ด ์์ฒญ์ ์ฒ๋ฆฌ๊ฐ ๊ฑฐ๋ถ๋๊ฑฐ๋ ์ฅ์๊ฐ ๋๊ธฐ
๋ ผ๋ธ๋กํน ๋ชจ๋ธ (Event Loop)
ํ๊ณ์ : ์์คํ ์ CPU ์ฐ์ฐ ๋ฅ๋ ฅ๊ณผ ๊ฐ์ฉ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ๊ณ์ ์ผ๋ก ์์ฉ
๋ณ๋ชฉ ํ์
CPU ๋ถํ: ์์คํ ์ ์ฒ๋ฆฌ ์ฉ๋์ ์ด๊ณผํ๋ ์์ฒญ์ด ์ ์ ๋๋ฉด, ์ด๋ฒคํธ ๋ฃจํ ์ค๋ ๋์ CPU ์ฌ์ฉ๋ฅ ์ด ์ฆ๊ฐํ๋ฉด์ ์ฒ๋ฆฌ ์๊ฐ์ด ์ ๋ฐ์ ์ผ๋ก ์ฆ๊ฐ
๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ : ์ฒ๋ฆฌ ์๋๋ณด๋ค ์ ์ ์๋๊ฐ ๋น ๋ฅผ ๊ฒฝ์ฐ, ์ฒ๋ฆฌ ๋๊ธฐ ์ค์ธ ์์ฒญ ๋ฐ์ดํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ง์์ ์ผ๋ก ๋์ ๋๋ฉด์
OutOfMemoryError๋ฅผ ์ ๋ฐ
๊ณผ๋ถํ ๊ด๋ฆฌ ๋ฉ์ปค๋์ฆ
Spring WebFlux์ ๊ทผ๊ฐ์ ์ด๋ฃจ๋ Netty๋ ๊ณผ๋ถํ๋ก๋ถํฐ ์์คํ ์ ๋ณดํธํ๊ธฐ ์ํด ๋ค์ธต์ ์ธ ๋ฐฉ์ด ๋ฉ์ปค๋์ฆ์ ๊ฐ์ถ๊ณ ์๋ค.
Backpressure(๋ฐฐ์)
๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ ํต์ฌ ์์น์ผ๋ก, ์๋น์๊ฐ ์์ ์ ์ฒ๋ฆฌ ์ฉ๋์ ๋ง์ถฐ ์์ฐ์์ ๋ฐ์ดํฐ ์์ฐ ์๋๋ฅผ ์ ์ดํ๋ ํผ๋๋ฐฑ ๋ฉ์ปค๋์ฆ
๋คํธ์ํฌ ๋ ๋ฒจ์์๋ TCP ํ๋ฆ ์ ์ด๊ฐ ์ด ์ญํ ์ ์์ฐ์ค๋ฝ๊ฒ ์ํ
์ ํ๋ฆฌ์ผ์ด์ ์ด TCP ์์ ๋ฒํผ์์ ๋ฐ์ดํฐ๋ฅผ ์๋นํ๋ ์๋๊ฐ ๋๋ ค์ง๋ฉด, ๋ฒํผ๊ฐ ์ฑ์์ง๊ณ TCP ์๋์ฐ(Window) ํฌ๊ธฐ๊ฐ ๊ฐ์
์ด๋ ์ก์ ์ธก(ํด๋ผ์ด์ธํธ)์ ์ ์ก ์๋๋ฅผ ๊ฐ์์์ผ ์์คํ ์ ์ฒ๋ฆฌ ์๋์ ์ ์ ์๋๋ฅผ ๋๊ธฐํ
Last updated
Was this helpful?