[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