Tokio 1.0 – Rust的异步运行时

2020-12-24 21:48:21

我们很高兴宣布Tokio的1.0版本,它是Rust编程语言的异步运行时。 Tokio为编写可靠的网络应用程序提供了所需的构建基块,而又不影响速度,它具有用于TCP,UDP,计时器,多线程,工作窃取调度程序等的异步API。

多年来,我们很高兴看到我们的用户创造了惊人的东西,例如Discord使用Tokio将尾部延迟降低了5倍。 Fly.io发现,使用Tokio,他们可以毫不费力地满足其性能要求,并专注于为客户提供功能。对于Zcash基金会而言,在Tokioable的基础上使他们能够设计可防止滥用的API。对于AWS,他们的Lambdateam使用Tokio实施更可靠,更灵活的服务。

我们四年前首次宣布了Tokio。从那时起,它有了长足的发展。最显着的变化发生在一年前,它为Rust添加了async和await。今天,Tikio变得更易于使用且功能更强大。这种演变也引起了一些摩擦。它具有所需的库来跟踪这些更改,并且在不小心依赖于多个版本的Tokio的情况下,可能导致混乱的错误消息。

Tokio 1.0版本结束了这一流失。作为版本的一部分,我们致力于为生态系统提供稳定的基础。我们目前没有针对Tokio 2.0的计划,并且我们承诺将Tokio 2.0版本推迟至少3年。我们计划将Tokio 1.0分支维持至少5年。Tokio将保持6个月的滚动MSRV(最低支持的rust版本)政策。当增加MSRV时,新的Rust版本必须至少六个月前发布。

这种稳定性并不意味着Tokio会停滞不前。我们还有很多工作要做。

我们预计明年将重点关注以下几个方面:流,io_uring,tracing集成和Tokio堆栈。

今天,tokio-stream板条箱提供了基于Stream特性的异步迭代实用程序。即将将Stream特性从Futures-core转移到Rust标准库的RFC正在等待批准。

一旦标准库提供了Stream特性,Tokio的stream实用程序将移入Tokio板条箱本身。

io_uring是一个新的Linux接口,为所有类型的I / O(包括磁盘)提供异步操作,同时减少了所需的系统调用数量。当前,在Linux上,Tokio使用epoll(7)接口,众所周知该接口无法用于磁盘访问。要解决此问题,Tokio通过将同步操作分派到线程池来提供异步文件系统API。尽管这可行,但这并不是最佳选择。

通过使用io_uring,Tokio将能够提供真正的异步文件系统操作。此外,io_uring的早期基准非常有前途,我们希望这些性能改进可以延续到Tokio。

定义有关运行Tokio应用程序的一流故事将成为2021年的重点。这个故事的很大一部分将是围绕跟踪和指标的工具。跟踪箱已经提供了许多所需的基础结构。它实现了用于结构化诊断的外观层和数据模型,从而允许库和应用程序均发出可以多种方式使用的机器可读数据。

在来年,我们将在跟踪和Tokio堆栈的其余部分之间建立更深入的集成。这种集成将有助于向Tokio内部提供必要的可见性,以回答问题。诸如如何调整Tokio运行时以减少尾部等待时间,知道当前正在运行哪些任务或最有争议的锁之类的问题。

此外,我们将继续改善和发展跟踪生态系统的其余部分。这包括努力开发新版本的核心追踪和追踪核心板条箱,向Tokio堆栈中的库添加更丰富的工具,并提供与其他诊断和可观察性工具的集成,例如追踪开放式遥测。

Tokio为标准原语(例如assockets和timers)提供了运行时和异步API,但是网络应用程序通常会使用更高级别的协议,例如HTTP和gRPC。 Tokio堆栈包括HTTP的Hyper和gRPC的Tonic,以解决这些需求。今天,我们发布了具有Tokio 1.0支持的Hyper 0.14。进补将很快更新。

随着Tokio 1.0的面世,我们还将专注于Tower,这是用于构建可靠的客户端和服务器的一组可重用组件。 没有我们的许多贡献者,尤其是AliceRyhl,Tokio将是不可能的,他对这个项目非常宝贵。 感谢Tokio堆栈库的负责人:Sean McArthur(Hyper),Lucio Franco(Tonic),Eliza Weisman(Tracing)和Thomas De Zeeuw(Mio)。此外,如果没有Aaron Turon,Tokio就不可能实现。 和Alex Crichton的早期参与。 最后,要感谢在财务上支持Tokio的公司:Mozilla,Dropbox,Buoyant和AWS。