[Rust] Tokio 1.0 ๋ฐํ (๋ฒ์ญ)
https://tokio.rs/blog/2020-12-tokio-1-0
Tokio์ 1.0 ๋ฆด๋ฆฌ์ฆ๋ฅผ ๋ฐํํ ์ ์๊ฒ ๋์ด์ ์ฐธ์ผ๋ก ๊ธฐ์จ์ด ํ๋์์ต๋๋ค. Tokio๋ Rust ์ธ์ด์ ๋น๋๊ธฐ ๋ฐํ์์ ๋๋ค.
Tokio๋ ๋ฏฟ์์งํ ๋คํธ์ํน ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ ์ ํ ์์ด ์์ฑํ ์ ์๊ฒ ํด์ฃผ๋ ์์๋ค์ ์ ๊ณตํฉ๋๋ค.
TCP, UDP, timer, ๋ฉํฐ์ค๋ ๋,work-stealing ์ค์ผ์ค๋ฌ ๋ฑ์ ๋ํ ๋น๋๊ธฐ API๋ค์ด ์์ฃ .
๋ช๋ ๊ฐ ์ฐ๋ฆฌ ํ์ tokio์ ์ฌ์ฉ์๋ค์ด ๋๋ผ์ด ๊ฒ๋ค์ ๋ง๋ค์ด๋ด๋ ๊ฒ์ ์ฆ๊ฒ๊ฒ ๋ณด์์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋์ค์ฝ๋๋ tokio๋ก tail latencies๋ฅผ 5๋ฐฐ ๋จ์ถํ์ต๋๋ค.
Fly.io๋ Tokio๋ฅผ ํตํด ์ฝ๊ฒ ์ฑ๋ฅ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ๊ณ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ฐ ์ง์คํ ์ ์์์ต๋๋ค.
Zcash Foundation์ Tokio๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถํด ์ค์ฉ ๋ฐฉ์ง(misuse-resistant) API๋ฅผ ์ค๊ณ ํ ์ ์์์ต๋๋ค.
AWS์ Lambda ํ์ Tokio๋ฅผ ์ฌ์ฉํด ๋ ๋ฏฟ์์งํ๊ณ ์ ์ฐํ ์๋น์ค๋ฅผ ๊ตฌํํ์ต๋๋ค.
Tokio๋ฅผ ์์ํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ธฐ ๊ฐ์ฅ ์ข์ ๊ณณ์ ํํ ๋ฆฌ์ผ์ ๋๋ค.
์์ ์ฑ ๋ณด์ฅ(stability guarantee)
์ฐ๋ฆฐ 4๋
์ ์ ์ฒ์์ผ๋ก tokio๋ฅผ ๋ฐํํ์ต๋๋ค.
๊ทธ ํ๋ก๋ ๊ณ์ํด์ ํฌ๊ฒ ๋ฐ์ ํด์๊ณ ์.
Tokio์์ ๊ฐ์ฅ ์ค์ํ ๋ณ๊ฒฝ์ ์ 1๋ ์ Rust์ async์ await๊ฐ ์ถ๊ฐ๋ ๋์ผ ๊ฒ๋๋ค.
์ค๋๋ tokio๋ ์ฌ์ฉํ๊ธฐ ๋ ์ฌ์์ก๊ณ , ๋ณด๋ค ๊ฐ๋ ฅํด์ก์ต๋๋ค.
ํ์ง๋ง ์ด ์งํ๋ ์ฝ๊ฐ์ ๋ง์ฐฐ์ ์ผ์ผํค๊ธฐ๋ ํ์ฃ .
์ด๋ฐ ๋ณ๊ฒฝ์ ๋ค์ ์ถ์ ํ๊ธฐ ์ํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํ์๋ก ํ๊ธฐ๋ ํ๊ณ , ์ด์ฉ๋ค ์ฌ๋ฌ ๋ฒ์ ์ tokio๋ฅผ ์์กดํ๋ ๊ฒฝ์ฐ ํผ๋์ค๋ฐ ์ค๋ฅ ๋ฉ์ธ์ง๊ฐ ๋จ๊ธฐ๋ ํ์ต๋๋ค.
Tokio 1.0 ๋ฆด๋ฆฌ์ฆ๋ ์ด๋ฌํ ํผ๋๋ค์ ์ข ์ง๋ถ๋ฅผ ์ฐ์ ๊ฒ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฆด๋ฆฌ์ฆ์ ์ผํ์ผ๋ก ์ํ๊ณ์ ์์ ์ ์ธ ๊ธฐ๋ฐ๋ค์ ์ ๊ณตํ๊ธฐ ์ํ ๋ ธ๋ ฅ๋ ๊ธฐ์ธ์ด๊ณ ์์ฃ .
์์ง 2.0 ๋ฒ์ ์ ๋ํ ๊ณํ์ ์์ต๋๋ค. ์ต์ํ 3๋ ๋์์ ๋ฒ์ 2์ ๋ํ ๋ฆด๋ฆฌ์ฆ๋ ๋ณด๋ฅํ ๊ฒ์ ์ฝ์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ต์ 5๋ ๋์์ 1.0 ๋ฒ์ ๋๋ฅผ ์ ์ง ๊ด๋ฆฌํ ๊ณํ์ ๋๋ค.
Tokio๋ MSRV(์ต์ ์ง์ Rust ๋ฒ์ :minimum supported rust version) ์ ์ฑ
์ 6๋ฌ ๋์์ ์ ์งํ ๊ฒ์
๋๋ค.
MSRV๋ฅผ ๋๋ฆด ๊ฒฝ์ฐ, ๊ทธ ์ Rust ๋ฒ์ ์ ์ต์ 6๊ฐ์ ์ ์ ์ถ์๋ ๊ฒ์ด์ด์ผ ํ์ฃ .
์ด ์์ ์ฑ์ tokio๊ฐ ์ ์ฒดํ๋ค๋ ๊ฒ์ด ์๋๋๋ค. ์์ง ์ฌ์ ํ ํด์ผํ ๊ฒ ๋ง๊ฑฐ๋ ์.
2021
๋ด๋ ์๋ stream, io_uring, ์ถ์ ํตํฉ, Tokio ์คํ ๋ฑ ๋ช ๊ฐ์ง ์์ญ์ ์ง์คํ ์์ ์ ๋๋ค.
์คํธ๋ฆผ(Stream)
ํ์ฌ. tokio-stream ํฌ๋ ์ดํธ๋ Stream trait ๊ธฐ๋ฐ์ ๋น๋๊ธฐ์ ์ธ ๋ฐ๋ณต ์ ํธ๋ฆฌํฐ๋ค์ ์ ๊ณตํฉ๋๋ค.
Streamย trait์ futures-core์์ Rust ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฎ๊ธฐ๋ ค๋ RFC๊ฐ ์น์ธ ๋๊ธฐ์ค์
๋๋ค.
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ Stream trait์ ์ ๊ณตํ๋ฉด Tokio์ Stream ์ ํธ๋ฆฌํฐ๋ Tokio ํฌ๋ ์ดํธ ์์ฒด๋ก ์ด๋ํ ๊ฒ๋๋ค.
io_uring
io_uring์ ๋์คํฌ๋ฅผ ํฌํจํ ๋ชจ๋ ํ์์ I/O์ ๋ํ ๋น๋๊ธฐ ์ฐ์ฐ์ ์ ๊ณตํ๋ ์ ๋ฆฌ๋ ์ค ์ธํฐํ์ด์ค์ ๋๋ค. ํ์ํ syscall ์๋ ๋จ์ถํ ์ ์๊ณ ์.
ํ์ฌ ๋ฆฌ๋ ์ค์์ Tokio๋ epoll(7) ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๊ฑด ๋์คํฌ ์ ๊ทผ์ ๋ํด์ ์๋ํ์ง ์๋ ๊ฑธ๋ก ์ ๋ช ์ด ๋์ฃ
์ด๊ฑธ ์์
ํ๊ธฐ ์ํด์ Tokio๋ ์ค๋ ๋ํ์ ๋๊ธฐ ์ฐ์ฐ์ ๋ฐ์กํ๋ ๊ฒ์ผ๋ก ๋น๋๊ธฐ์ ํ์ผ์์คํ
API๋ฅผ ์ ๊ณตํฉ๋๋ค.
->To work around this, Tokio provides asynchronous filesystem APIs by dispatching synchronous operations to a thread pool.
์ด๋ ๊ฒ ๋์ํ๋ ๋์์ ์ต์ ์ ์ํ๊ฐ ์๋๋๋ค.
io_uring์ ํ์ฉํ๋ฉด Tokio๋ ๋ ๋ฉ์ง ๋น๋๊ธฐ ํ์ผ์์คํ ์ฐ์ฐ์ ์ ๊ณตํ ์ ์๊ฒ ๋ ๊ฒ๋๋ค.
๊ฒ๋ค๊ฐ, io_uring์ ์ด๊ธฐ ๋ฒค์น๋งํฌ๋ ๋งค์ฐ ์ ๋งํฉ๋๋ค. ์ด๋ฌํ ์ฑ๋ฅ ํฅ์์ด Tokio์ ์ด์ด์ง๊ธฐ๋ฅผ ํฌ๋งํฉ๋๋ค.
์ถ์ (tracing)
2021๋ ์๋ Tokio ์ ํ๋ฆฌ์ผ์ด์ ์ด์์ ๊ดํ first class ์คํ ๋ฆฌ๋ฅผ ์ ์ํ๋ ๊ฒ์ด ์ด์ ์ด ๋ ๊ฒ์ ๋๋ค.
์ด ์ด์ผ๊ธฐ์ ํฐ ๋ถ๋ถ์ ์ถ์ ๊ณผ metric์ ๋ํ ๋๊ตฌ์ ๋๋ค.
tracing ํฌ๋ ์ดํธ๋ ์ด๋ฏธ ํ์ํ ๊ธฐ๋ฐ๊ตฌ์กฐ๋ค์ ๋ง์ด ์ ๊ณตํฉ๋๋ค.
์ด๊ฑด ๊ตฌ์กฐํ๋ ์ง๋จ์ ์ํ ํผ์ฌ๋(facade) ๋ ์ด์ด์ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๊ตฌํํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์
๋ชจ๋์๊ฒ ๋ค์ํ ๋ฐฉ์์ผ๋ก ํ์ฉํ ์ ์๋ ๊ธฐ๊ณ์นํ์ ์ธ(machine-readable) ๋ฐ์ดํฐ๋ฅผ ๋ฐฉ์ถํ ์ ์๊ฒ๋ ํด์ฃผ๊ณ ์.
๋ค๊ฐ์ค๋ ํด์๋ tracing๊ณผ Tokio stack ๊ฐ์ ์ข๋ ๊น์ ํตํฉ์ ๊ตฌ์ถํ ๊ฒ๋๋ค.
์ด ํตํฉ์ ์ง๋ฌธ์ ๋ตํ๊ธฐ ์ํด Tokio์ ๋ด๋ถ์ ํ์ํ ๊ฐ์์ฑ์ ์ ๊ณตํ๋ ๋ฐ ๋์์ด ๋ ๊ฑฐ์์.
tail latencies๋ฅผ ์ค์ด๊ธฐ ์ํด Tokio ๋ฐํ์์ ํ๋ํ๋ ๋ฐฉ๋ฒ, ํ์ฌ ์คํ์ค์ธ ์์ ๋๋ ๊ฐ์ฅ ๊ฒฝ์์ด ์ฌํ lock์ ํ์ ํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ฐ์ ์ง๋ฌธ ๋ง์ด์ฃ .
๋ํ ๋๋จธ์ง tracing ์ํ๊ณ๋ฅผ ์ง์์ ์ผ๋ก ๊ฐ์ ํ๊ณ ์ฑ์ฅ์ํฌ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์๋ core tracing ๋ฐ tracing-core ํฌ๋ ์ดํธ์ ์ ๋ฆด๋ฆฌ์ค์ ๋ํ ์์ , Tokio ์คํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ ํ๋ถํ ๋๊ตฌ ๊ธฐ๋ฅ ์ถ๊ฐ, tracing-opentelemetry๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ง๋จ ๋ฐ ๊ด์ฐฐ ๋๊ตฌ์์ ํตํฉ ์ ๊ณต์ด ํฌํจ๋ฉ๋๋ค.
The Tokio stack
Tokio๋ ์์ผ ๋ฐ ํ์ด๋จธ์ ๊ฐ์ ํ์ค ํ๋ฆฌ๋ฏธํฐ๋ธ์ ๋ํ ๋ฐํ์๊ณผ ๋น๋๊ธฐ API๋ฅผ ์ ๊ณตํ์ง๋ง, ๋คํธ์ํน ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ์ข HTTP ๋ฐ gRPC์ ๊ฐ์ ๋ ๋์ ์์ค์ ํ๋กํ ์ฝ์ ์ฌ์ฉํฉ๋๋ค.
Tokio Stack์ ์ด๋ฌํ ์๊ตฌ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด HTTP ์ฉ Hyper์ gRPC ์ฉ Tonic์ ํฌํจํฉ๋๋ค.
ํ์ฌ Tokio 1.0์ ์ง์ํ๋ Hyper 0.14๋ฅผ ๋ฆด๋ฆฌ์ฆํ์ต๋๋ค. Tonic๋ ๊ณง ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
Tokio 1.0์ด ์ถ์๋๋ฉด Tower์๋ ์ด์ ์ ๋ง์ถ ๊ฒ์ ๋๋ค. Tower๋ ๋ฏฟ์์งํ ํด๋ผ์ด์ธํธ ๋ฐ ์๋ฒ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์ ์งํฉ์ ๋๋ค.
๊ฐ์ฌ์ ๋ง์
Tokio๋ ์๋ง์ ์ปจํธ๋ฆฌ๋ทฐํฐ๋ค์ ์ง์์ด ์์๋ค๋ฉด ๋ถ๊ฐ๋ฅํ์ต๋๋ค. ํนํ Alice Ryhl์ ๊ณตํ์ด ์ง๋ํ์ฃ .
Tokio ์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ฆฌ๋๋ค์๊ฒ๋ ๊ฐ์ฌ๋ฅผ ํํฉ๋๋ค.
Sean McArthurย (Hyper)
Lucio Francoย (Tonic)
Eliza Weismanย (Tracing)
Thomas De Zeeuwย (Mio)
๋ํ Tokio์ ์ฑ๋ฆฝ์ Aaron Turon๊ณผ Alex Crichton์ ์ด๊ธฐ ์ฐธ์ฌ ์์ด๋ ๋ถ๊ฐ๋ฅํ์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก Tokio์ ์ฌ์ ์ ์ธ ์ง์์ ์๋ผ์ง ์์ ๊ธฐ์
๋ค์๊ฒ๋ ํฐ ๊ฐ์ฌ๋ฅผ ํํฉ๋๋ค.
Mozilla
Dropbox
Buoyant
AWS
โCarl Lerche