ํ์ด์ฌ ๋น๋๊ธฐ๋ ์ฑ๋ฅ ํฅ์์ ๋ต์ด ์๋๋๋ค
ํ์ด์ฌ ๋น๋๊ธฐ๋ ์ฑ๋ฅ ํฅ์์ ๋ต์ด ์๋๋๋ค ๊ด๋ จ
๋ณธ๋ฌธ์ ์์ฆIT์ ๋ฒ์ญ๊ฐ David๊ฐ ํจ๊ป ์นผ ํจํฐ์จ(Cal paterson)์ ๊ธ <Async Python is not faster>์ ๋ฒ์ญํ ๊ธ์ ๋๋ค. ํ์์ธ ์นผ ํจํฐ์จ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์ ๊ฐ์ ์ด ์๋ ์๋์ด ๊ฐ๋ฐ์๋ก, ๊ธ์ต, ์๋์ง ๋ถ์ผ์์์ ํ๋ถํ ๊ฒฝํ์ ๋ณด์ ํ๊ณ ์์ต๋๋ค. ์ด ๊ธ์์๋ ํ์ด์ฌ ๋น๋๊ธฐ ๋ฐฉ์์ ์ฑ๋ฅ์ ๊ดํด ์ด์ผ๊ธฐํฉ๋๋ค.
ํ์์๊ฒ ํ๋ฝ์ ๋ฐ๊ณ ๋ฒ์ญํ์ผ๋ฉฐ, ๊ธ์ ํฌํจ๋ ๊ฐ์ฃผ(*ํ์)๋ โ๋ฒ์ญ์์ฃผโ์ ๋๋ค. ๊ธ์ ํฌํจ๋ ๋งํฌ๋ ์๋ฌธ์ ๋ฐ๋ผ ํ์ํ์ต๋๋ค.
์ค์ ๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, ๋น๋๊ธฐ ํ์ด์ฌ์ด ์ผ๋ฐ โ๋๊ธฐ์โ ํ์ด์ฌ๋ณด๋ค ์คํ๋ ค ๋ ๋๋ฆฝ๋๋ค. ๋ ํฐ ๋ฌธ์ ๋ ๋น๋๊ธฐ ํ๋ ์์ํฌ๋ค์ด ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๋ฉด ๋ถ์์ ํด์ง๋ค๋ ์ ์ด์ฃ .
๋๋ถ๋ถ์ ๊ฐ๋ฐ์๋ค์ ๋น๋๊ธฐ ํ์ด์ฌ์ด ๋ ๋์ ๋์์ฑ์ ์ ๊ณตํ๋ค๋ ๊ฒ์ ์๊ณ ์์ฃ . ๊ทธ๋์ ๋์ ์น์ฌ์ดํธ๋ ์น API[1]๋ฅผ ์๋นํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์์ ์์ ๋ ์ข์ ์ฑ๋ฅ์ ๋ณด์ผ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๊ธฐ ์ฝ์ต๋๋ค.
ํ์ง๋ง ์ํ๊น๊ฒ๋ ๋น๋๊ธฐ๋ ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ์ ์ฑ๋ฅ์ ๋ง๋ฒ์ฒ๋ผ ๋์ฌ์ฃผ๋ ํด๊ฒฐ์ฑ ์ด ์๋๋๋ค. ์ค์ ์ํฉ(์๋ ์ฐธ์กฐ)์์ ํ ์คํธํด ๋ณด๋ฉด, ๋น๋๊ธฐ ์น ํ๋ ์์ํฌ๋ ์ฒ๋ฆฌ๋(์ด๋น ์์ฒญ ์) ๋ฉด์์ ์คํ๋ ค ์ฝ๊ฐ ๋ ์ ์ข์ ์ฑ๋ฅ์ ๋ณด์ด๊ณ , ์ง์ฐ ์๊ฐ์ ๋ณ๋ ํญ์ ํจ์ฌ ๋ ํฐ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ
๋ค์ํ ๋๊ธฐ์๊ณผ ๋น๋๊ธฐ์ ์น์๋ฒ ์ค์ ์ผ๋ก ํ ์คํธ๋ฅผ ์งํํด ๋ดค์ต๋๋ค.
50๋ฒ์งธ์ 99๋ฒ์งธ ๋ฐฑ๋ถ์ ์๋ต ์๊ฐ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก, ์ฒ๋ฆฌ๋์ ์ด๋น ์์ฒญ ์๋ก ์ธก์ ํ์ต๋๋ค. ์ค์ ์๋น์ค ์ด์์์ ๊ฐ์ฅ ์ค์ํ๋ค๊ณ ์๊ฐ๋๋ P99 ๊ธฐ์ค์ผ๋ก ํ๋ฅผ ์ ๋ ฌํ์ต๋๋ค.
์ฃผ๋ชฉํ ๋งํ ์ ๋ค์ ์ ๋ฆฌํด ๋ณด๋ฉด:
- ๊ฐ์ฅ ์ข์ ์ฑ๋ฅ์ ๋ณด์ธ ๊ฒ์ ๋๊ธฐ์ ํ๋ ์์ํฌ๋ค์
๋๋ค.
- ๋ค๋ง ํ๋ผ์คํฌ(Flask)๋ ๋ค๋ฅธ ๊ฒ๋ค์ ๋นํด ์ฒ๋ฆฌ๋์ด ์ข ๋จ์ด์ง๋๋ค.
- ๊ฐ์ฅ ์ฑ๋ฅ์ด ์ ์ข์ ๊ฒ๋ค์ ์ ๋ถ ๋น๋๊ธฐ ํ๋ ์์ํฌ์์ต๋๋ค.
- ๋น๋๊ธฐ ํ๋ ์์ํฌ๋ค์ ์ง์ฐ ์๊ฐ์ ๋ณ๋ ํญ์ด ํจ์ฌ ์ปธ์ต๋๋ค.
- Uvloop ๊ธฐ๋ฐ ์ต์
๋ค์ ๊ธฐ๋ณธ asyncio ๋ฃจํ๋ณด๋ค ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์์ต๋๋ค.
- ๊ทธ๋์ ์ด์ฉ ์ ์์ด asyncio๋ฅผ ์จ์ผ ํ๋ค๋ฉด, Uvloop๋ฅผ ์ฐ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ๊ฐ ํ์ค์ ์ ๋๋ก ๋ฐ์ํ ๊น์?
์ ๋ ๊ฐ๋ฅํ ํ ์ค์ ํ๊ฒฝ๊ณผ ์ ์ฌํ๊ฒ ๋ฒค์น๋งํฌ๋ฅผ ๊ตฌ์ฑํ๊ณ ์ ํ์ต๋๋ค. ๋ค์์ ์ ๊ฐ ์ฌ์ฉํ ์ํคํ ์ฒ์ ๋๋ค.
์ค์ ๋ฐฐํฌ ํ๊ฒฝ์ ์ต๋ํ ํ์ค์ ์ผ๋ก ๊ตฌํํ์ต๋๋ค. ๋ฆฌ๋ฒ์ค ํ๋ก์, ํ์ด์ฌ ์ฝ๋(๋ณ์), ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๋ํ ์ค์ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ํ๊ฒฝ(ํนํ PostgreSQL ์ฌ์ฉ ์)์์ ํํ ๋ณผ ์ ์๋ ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ํ๋ฌ๋ ์ถ๊ฐํ์ต๋๋ค.
ํ
์คํธ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฌด์์ ํค๋ก ํ์ ์กฐํํ์ฌ, JSON ํํ๋ก ๋ฐํํ๋ ์์
์ ์ํํฉ๋๋ค. ์ ์ฒด ์์ค ์ฝ๋๋ calpaterson/python-web-perf
์์ ํ์ธํ ์ ์์ต๋๋ค.
์์ปค ์๊ฐ ๋ค์ํ ์ด์
๊ฐ ํ๋ ์์ํฌ์ ์ต์ ์์ปค ํ๋ก์ธ์ค ์๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋จ์ํ ๊ท์น์ ์ ์ฉํ์ต๋๋ค: ๋จ์ผ ์์ปค์์ ์์ํ์ฌ ์ฑ๋ฅ์ด ์ ํ๋ ๋๊น์ง ์์ปค ์๋ฅผ ์ ์ง์ ์ผ๋ก ์ฆ๊ฐ์์ผฐ์ต๋๋ค. ์ต์ ์ ์์ปค ์๊ฐ ๋๊ธฐ์๊ณผ ๋น๋๊ธฐ์ ํ๋ ์์ํฌ ๊ฐ์ ์ฐจ์ด๋ฅผ ๋ณด์ด๋ ์ด์ ๋ ๋ช ํํฉ๋๋ค. ๋น๋๊ธฐ ํ๋ ์์ํฌ๋ I/O ๋์์ฑ ๋๋ถ์, ๋จ์ผ ์์ปค ํ๋ก์ธ์ค๋ง์ผ๋ก๋ CPU๋ฅผ ์ต๋๋ก ํ์ฉํ ์ ์์ต๋๋ค.
๋ฐ๋ฉด, ๋๊ธฐ์ ์์ปค์ ๊ฒฝ์ฐ๋ ๋ค๋ฆ ๋๋ค. I/O ์์ ์ ํด๋น ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๋ธ๋กํน๋๋ฏ๋ก, ๋ถํ ์ํฉ์์ ๋ชจ๋ CPU ์ฝ์ด๋ฅผ ์ต๋ํ ํ์ฉํ๊ธฐ ์ํด์๋ ์ถฉ๋ถํ ์์ ์์ปค๊ฐ ํ์ํฉ๋๋ค. ์ด์ ๋ํ ์์ธํ ๋ด์ฉ์ gunicorn ๋ฌธ์์์ ํ์ธํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์์ปค ์๋ (2 x CPU ์ฝ์ด ์) + 1์ ๊ถ์ฅํฉ๋๋ค. ์๋ฐํ ๊ณผํ์ ์ธ ๊ณต์์ ์๋์ง๋ง, ์ด๋ ๊ฐ ์ฝ์ด๋น ํ ์์ปค๊ฐ ์์ผ ์ฝ๊ธฐ/์ฐ๊ธฐ๋ฅผ ๋ด๋นํ๊ณ ๋ค๋ฅธ ์์ปค๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๋ค๋ ๊ฐ์ ์ ๊ธฐ๋ฐํฉ๋๋ค.
ํ ์คํธ ํ๊ฒฝ ์ฌ์
๋ฒค์น๋งํฌ๋ Hetzner์ CX31 ๋จธ์ ํ์ (4 "vCPU"/8GB RAM)์์ ์คํ๋์์ผ๋ฉฐ, ์ฐ๋ถํฌ(Ubuntu) 20.04 ํ๊ฒฝ์์ ์งํํ์ต๋๋ค. ๋ถํ ์์ฑ๊ธฐ๋ ๋ณ๋์ (๋ ์์) VM(๊ฐ์๋จธ์ )[2]์์ ์คํํ์ต๋๋ค.
๋น๋๊ธฐ๋ ์ ์ฑ๋ฅ์ด ๋ ์ ์ข์๊น?
์ฒ๋ฆฌ๋(Throughput)
์ฒ๋ฆฌ๋(์ด๋น ์์ฒญ ์) ์ธก๋ฉด์์ ์ฃผ์ ์์ธ์ ๋๊ธฐ์ ๋น๋๊ธฐ์ ์ฐจ์ด๊ฐ ์๋, ์ผ๋ง๋ ๋ง์ ํ์ด์ฌ ์ฝ๋๊ฐ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋์ฒด๋์๋๊ฐ์ ๋๋ค. ๊ฐ๋จํ ๋งํด, ์ฑ๋ฅ์ ๋ฏผ๊ฐํ ํ์ด์ฌ ์ฝ๋๋ฅผ ๋ ๋ง์ด ๋์ฒดํ ์๋ก ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ ๋๋ค. ์ด๋ ์ค๋ ์ญ์ฌ๋ฅผ ๊ฐ์ง ํ์ด์ฌ ์ฑ๋ฅ ์ต์ ํ ์ ๋ต์ ๋๋ค. (numpy๊ฐ ๋ํ์ ์ฌ๋ก)
์ง์ฐ ์๊ฐ(Latency)
์ง์ฐ ์๊ฐ ๋ฌธ์ ๋ ๋ ๊ทผ๋ณธ์ ์ ๋๋ค. ๋ถํ ์ํฉ์์ ๋น๋๊ธฐ๋ ์ข์ง ์์ ์ฑ๋ฅ์ ๋ณด์ด๋ฉฐ, ์ง์ฐ ์๊ฐ์ด ์ ํต์ ์ธ ๋๊ธฐ์ ๋ฐฐํฌ ํ๊ฒฝ๋ณด๋ค ํจ์ฌ ๋ ํฌ๊ฒ ์ฆ๊ฐํฉ๋๋ค. ์ด์ ๊ฐ ๋ฌด์์ผ๊น์? ๋น๋๊ธฐ ํ์ด์ฌ์์ ๋ฉํฐ์ค๋ ๋ฉ[3]์ **ํ๋ ฅ์ (co-operative)**์ ๋๋ค. ์ด๋ ์ปค๋๊ณผ ๊ฐ์ ์ค์ ๊ด๋ฆฌ์์ ์ํด ์ค๋ ๋๊ฐ ๊ฐ์ ๋ก ์ค๋จ๋๋ ๊ฒ์ด ์๋๋ผ, ์ค๋ ๋๊ฐ ์๋ฐ์ ์ผ๋ก ์คํ ์๊ฐ์ ๋ค๋ฅธ ์ค๋ ๋์ ์๋ณดํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. asyncio์์๋ โawaitโ, โasync forโ, โasync withโ๋ผ๋ ์ธ ๊ฐ์ง ํค์๋๋ฅผ ํตํด ์คํ ๊ถํ์ด ์๋๋ฉ๋๋ค.
์ด๋ ์คํ ์๊ฐ์ด โ๊ณต์ ํ๊ฒโ ๋ถ๋ฐฐ๋์ง ์์ผ๋ฉฐ, ํ ์ค๋ ๋๊ฐ ์์ ์ ์ํํ๋ ๋์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์๋์น ์๊ฒ CPU ์๊ฐ์ ํ ๋น๋ฐ์ง ๋ชปํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๊ฒ์ด ์ง์ฐ ์๊ฐ์ด ๋ ๋ถ์์ ํ ์ด์ ์ ๋๋ค.
๋ฐ๋ฉด UWSGI์ ๊ฐ์ ์ ํต์ ์ธ ๋๊ธฐ์ ํ์ด์ฌ ์น์๋ฒ๋ ์ปค๋ ์ค์ผ์ค๋ฌ์ ์ ์ ์ (pre-emptive) ๋ฉํฐํ๋ก์ธ์ฑ[4]์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ์ฃผ๊ธฐ์ ์ผ๋ก ํ๋ก์ธ์ค์ ์คํ์ ๊ต์ฒดํจ์ผ๋ก์จ ๊ณต์ ์ฑ์ ๋ณด์ฅํ๋ ค ํฉ๋๋ค. ๋ฐ๋ผ์ ์๊ฐ์ด ๋ ๊ณต์ ํ๊ฒ ๋ถ๋ฐฐ๋์ด ์ง์ฐ ์๊ฐ์ ๋ณ๋ ํญ์ด ๋ ์์ต๋๋ค.
๋ค๋ฅธ ๋ฒค์น๋งํฌ์์๋ ์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ๊น?
๋๋ถ๋ถ์ ๋ค๋ฅธ ๋ฒค์น๋งํฌ(ํนํ ๋น๋๊ธฐ ํ๋ ์์ํฌ ์ ์์๋ค์ ๋ฒค์น๋งํฌ)๋ ๋๊ธฐ์ ํ๋ ์์ํฌ์ ์ถฉ๋ถํ ์์ปค๋ฅผ ์ค์ ํ์ง ์์ต๋๋ค. ์ด๋ก ์ธํด ๋๊ธฐ์ ํ๋ ์์ํฌ๋ค์ด ์ค์ ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ CPU ์๊ฐ์ ๋๋ถ๋ถ์ ํ์ฉํ์ง ๋ชปํ๊ฒ ๋ฉ๋๋ค.
๋ค์์ Vibora ํ๋ก์ ํธ์ ๋ฒค์น๋งํฌ ์ฌ๋ก์ ๋๋ค. (์ด ํ๋ ์์ํฌ๋ ์๋์ ์ผ๋ก ์ธ์ง๋๊ฐ ๋ฎ์ ํ ์คํธํ์ง ์์์ต๋๋ค.)
Vibora๋ ํ๋ผ์คํฌ(Flask)๋ณด๋ค 500% ๋์ ์ฒ๋ฆฌ๋์ ๋ณด์ธ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ํ์ง๋ง ๊ทธ๋ค์ ๋ฒค์น๋งํฌ ์ฝ๋๋ฅผ ๊ฒํ ํด ๋ณด๋, Flask๋ฅผ CPU ๋น 1๊ฐ์ ์์ปค๋ง ์ฌ์ฉํ๋๋ก ์๋ชป ์ค์ ํ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ด๋ฅผ ์์ ํ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์์ต๋๋ค.
Webserver | Throughput |
---|---|
Flask | 11925 req/s |
Vibora | 14148 req/s |
๋ ๋ค๋ฅธ ๋ฌธ์ ์ ์ ๋ง์ ๋ฒค์น๋งํฌ๊ฐ ์ง์ฐ ์๊ฐ๋ณด๋ค ์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๋ฅผ ์ฐ์ ์ํ๋ค๋ ์ ์ ๋๋ค. (์๋ฅผ ๋ค์ด, Vibora์ ๋ฒค์น๋งํฌ๋ ์ง์ฐ ์๊ฐ์ ์์ ์ธ๊ธํ์ง ์์) ๊ทธ๋ฌ๋ ์ฒ๋ฆฌ๋์ ๋จธ์ ์ ์ถ๊ฐํจ์ผ๋ก์จ ๊ฐ์ ํ ์ ์์ง๋ง, ๋ถํ ์ํฉ์์์ ์ง์ฐ ์๊ฐ์ ๋จธ์ ์ ์ถ๊ฐํ๋ค๊ณ ํด์ ๊ฐ์ ๋์ง ์์ต๋๋ค. ์ฒ๋ฆฌ๋ ์ฆ๊ฐ๋ ์ง์ฐ ์๊ฐ์ด ํ์ฉ ๊ฐ๋ฅํ ๋ฒ์ ๋ด์ ์์ ๋๋ง ์๋ฏธ๊ฐ ์์ต๋๋ค.
์ถ๊ฐ์ ์ธ ๊ณ ์ฐฐ๊ณผ ํ์ฅ ๊ฒฝํ
์ ๊ฐ ์งํํ ๋ฒค์น๋งํฌ๋ ๊ตฌ์ฑ ์์ ๋ฉด์์๋ ๊ฝค ํ์ค์ ์ด์์ง๋ง, ์ค์ ์ํฌ๋ก๋์ ๋นํ๋ฉด ์ฌ์ ํ ๋จ์ํ ํธ์ด์์ต๋๋ค. ๋ชจ๋ ์์ฒญ์ด ๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๋ฅผ ์ํํ๊ฑฐ๋ ์. ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ์ฌ ๋ ๋ค์ํฉ๋๋ค. ๋๋ฆฐ ์์ , ๋น ๋ฅธ ์์ , I/O๋ฅผ ๋ง์ด ์ฐ๋ ์์ , CPU๋ฅผ ๋ง์ด ์ฐ๋ ์์ ์ด ์์ฌ ์์ฃ . ์ ๊ฒฝํ์ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ง์ฐ ์๊ฐ์ ๋ณ๋ ํญ์ด ํจ์ฌ ๋ ํฌ๊ฒ ๋ํ๋ฉ๋๋ค.
๋ณต์กํ ํ๊ฒฝ์์๋ ๋น๋๊ธฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ์ ํ ๋ฌธ์ ๊ฐ ๋์ฑ ์ฌํ๋ ๊ฒ์ผ๋ก ์์ธก๋ฉ๋๋ค. ์ฌ๋ฌ ํ์ฅ ์ฌ๋ก๋ ์ด๋ฅผ ๋ท๋ฐ์นจํฉ๋๋ค.
์ฃ์(Etsy)์ ๋ ๋งฅํจ๋ฆฌ(Dan McKinley (mcfunley
))๋ ํธ์์คํฐ๋(Twisted) ๊ธฐ๋ฐ ์์คํ
์ด์ ๊ฒฝํ์ ๊ณต์ ํ๋๋ฐ์. ๊ทธ๋ค์ ์์คํ
์ ์ง์ฐ ์๊ฐ์ด ์ฌ๊ฐํ๊ฒ ๋ถ์์ ํ๋ค๊ณ ํฉ๋๋ค.
ํธ์์คํฐ๋ ์ ๋ฌธ๊ฐ๋ค๋ ์ธ์ ํ์ต๋๋ค. ํธ์์คํฐ๋๊ฐ ์ ์ฒด์ ์ธ ์ฒ๋ฆฌ๋์ ์ข์ง๋ง, ์ผ๋ถ ์์ฒญ์์ ์ฌ๊ฐํ ์ง์ฐ์ด ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์ ๋ง์ด์ฃ .์ฃ์์์คํ ์์๋ PHP ํ๋ก ํธ์๋๊ฐ ์ด ๊ธฐ๋ฅ์ ํ ๋ฒ์ ์น ์์ฒญ์์ ์๋ฐฑ, ์์ฒ ๋ฒ์ฉ ํธ์ถํ๊ธฐ ๋๋ฌธ์ ํฐ ๋ฌธ์ ์์ต๋๋ค.
๋ํ SQLAlchemy ์ ์์์ธ ๋ง์ดํฌ ๋ฒ ์ด์ด(Mike Bayer)๋ ๋ช ๋ ์ โ๋น๋๊ธฐ ํ์ด์ฌ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์คโ๋ผ๋ ๊ธ์์ ๋ค๋ฅธ ๊ด์ ์ผ๋ก ๋น๋๊ธฐ๋ฅผ ๋ถ์ํ๋๋ฐ, ์ญ์ asyncio๊ฐ ๋ ํจ์จ์ ์ด๋ผ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ต๋๋ค.
Rachel by the Bay์์๋ โํ์ด์ฌ, Gunicorn, Gevent์ ๊ดํ ๊ณ ์ฐฐโ์ด๋ผ๋ ๊ธ๋ก gevent ๊ธฐ๋ฐ ์ค์ ์ผ๋ก ์ธํ ์ด์ ํผ๋์ ์ค๋ช ํ์ต๋๋ค. ์ ๋ ํ๋ก๋์ ํ๊ฒฝ์์ gevent๋ก ๊ณ ์ํ ์ ์ด ์์ฃ . (์ฑ๋ฅ ๋ฌธ์ ๋ ์๋์์ต๋๋ค.)
๋ ํ ๊ฐ์ง ์ธ๊ธํ ์ ์ ์ด ๋ฒค์น๋งํฌ๋ฅผ ์ค์ ํ๋ ๊ณผ์ ์์ ๋ชจ๋ ๋น๋๊ธฐ ๊ตฌํ์ด ์ฑ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ์ผ์ผ์ผฐ๋ค๋ ๊ฒ๋๋ค. Uvicorn์ ์์ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ์ง ์์ ์ฑ ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋์ด์, 8001 ํฌํธ๋ฅผ ์ก๊ณ ์๋ ์์ ํ๋ก์ธ์ค๋ค์ ์ผ์ผ์ด ์ฐพ์ ์ฃฝ์ฌ์ผ ํ์ต๋๋ค. AIOHTTP[5]๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ ๊ด๋ จ ๋ด๋ถ ์ค๋ฅ๋ฅผ ์ผ์ผ์ผฐ๋๋ฐ ์ข ๋ฃ๋์ง ์์์ฃ . (ํ๋ก์ธ์ค ๊ฐ์์๊ฐ ์ฌ์์ํ ์ ์๋ ์ํฉ์ผ๋ก ์น๋ช ์ ์ธ ๋ฌธ์ ์ ๋๋ค.) Daphne๋ ๋ก์ปฌ์์ ๋ฌธ์ ๊ฐ ์์๋๋ฐ, ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ๊ธฐ์ต๋์ง ์๋ค์.
ํด๋น ์ค๋ฅ๋ค์ SIGKILL[6]์ ํตํด ์ผ์์ ์ผ๋ก ํด๊ฒฐํ ์ ์์์ผ๋, ํ๋ก๋์ ํ๊ฒฝ์์ ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์์กดํ๋ ์ฝ๋๋ฅผ ์ด์ํ๋ ๊ฒ์ ์ํ ๋ถ๋ด์ด ์์ต๋๋ค. ๋ฐ๋ฉด, Gunicorn๊ณผ UWSGI์ ๊ฒฝ์ฐ ์์ ์ ์ธ ์ด์์ด ๊ฐ๋ฅํ์ต๋๋ค. ๋ค๋ง UWSGI์ ๊ฒฝ์ฐ, ์ ํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ ์คํจ ์ ํ๋ก์ธ์ค๊ฐ ์ ์์ ์ผ๋ก ์ข ๋ฃ๋์ง ์๋๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
๊ฒฐ๋ก
์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด์๋ ์ผ๋ฐ์ ์ธ ๋๊ธฐ์ ํ์ด์ฌ์ ํ์ฉํ๋, ๊ฐ๋ฅํ ํ ๋ง์ ๋ถ๋ถ์ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๊ตฌํํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค. ์น์๋ฒ ๊ตฌํ์ ์์ด ๋์ ์ฒ๋ฆฌ๋์ด ์๊ตฌ๋๋ ๊ฒฝ์ฐ, ํ๋ผ์คํฌ ์ด์ธ์ ํ๋ ์์ํฌ๋ฅผ ๊ณ ๋ คํด ๋ณผ ์ ์์ต๋๋ค. ๋ค๋ง UWSGI ๊ธฐ๋ฐ์ ํ๋ผ์คํฌ ๊ตฌํ ์ญ์ ์ฐ์ํ ๋ ์ดํด์ ํน์ฑ์ ๋ณด์ฌ์ฃผ๊ณ ์์ด, ์ถฉ๋ถํ ๊ฒฝ์๋ ฅ ์๋ ์ ํ์ด ๋ ์ ์์ต๋๋ค.
API: ์๋ก ๋ค๋ฅธ ํ๋ก๊ทธ๋จ๋ค์ด ์ํตํ๊ธฐ ์ํ ์ฝ์๋ ๋ฐฉ์ โฉ๏ธ
๊ฐ์๋จธ์ : ๋ฌผ๋ฆฌ์ ์ธ ์ปดํจํฐ ํ๋์จ์ด๋ฅผ ์ํํธ์จ์ด๋ก ๊ตฌํํ ๊ฒ โฉ๏ธ
๋ฉํฐ์ค๋ ๋ฉ: ํ๋์ ํ๋ก๊ทธ๋จ ์์์ ๋ ์ด์์ ์คํ ํ๋ฆ(์ค๋ ๋)์ ๋์์ ์ฒ๋ฆฌํ๋ ๊ธฐ์ โฉ๏ธ
๋ฉํฐํ๋ก์ธ์ฑ: ์ฌ๋ฌ ๊ฐ์ ํ๋ก์ธ์(CPU)๊ฐ ๊ฐ๊ฐ ๋ ๋ฆฝ๋ ํ๋ก์ธ์ค๋ฅผ ๋์์ ์คํํ๋ ๋ฐฉ์์ ๋๋ค. โฉ๏ธ
AIOHTTP: ํ์ด์ฌ์ ๋น๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฉํ HTTP ํด๋ผ์ด์ธํธ/์๋ฒ ํ๋ ์์ํฌ โฉ๏ธ
SIGKILL: ํ๋ก์ธ์ค๋ฅผ ์ฆ์ ๊ฐ์ ์ข ๋ฃํ๋ ์๊ทธ๋(์ ํธ) โฉ๏ธ