我的第一个 Rust Web 服务(以及其他第一个)
目录 多个第一 锈是不同的 经线 树莓派 4 基准 多个第一 这篇博文对我来说是许多第一次。我的第一篇博文,第一篇关于 medium 的文章,第一次在树莓派上编译 Rust 代码,第一次在树莓派上对 Web 服务进行基准测试,......可能还有更多。所以请给我反馈,告诉我如何为你改进我的写作! 我意识到存在一个庞大的社区,他们渴望学习我正在学习的东西,但却难以进入技术领域。因此,我写作的目标是通
目录
-
多个第一
-
锈是不同的
-
经线
-
树莓派 4 基准
多个第一
这篇博文对我来说是许多第一次。我的第一篇博文,第一篇关于 medium 的文章,第一次在树莓派上编译 Rust 代码,第一次在树莓派上对 Web 服务进行基准测试,......可能还有更多。所以请给我反馈,告诉我如何为你改进我的写作!
我意识到存在一个庞大的社区,他们渴望学习我正在学习的东西,但却难以进入技术领域。因此,我写作的目标是通过提供我的经验、源代码,甚至直接帮助任何最有效的渠道来降低这个障碍。随意在这里提问,或推特,或任何东西。我希望你能接受我的项目并以此为基础。
锈是不同的
根据堆栈溢出开发人员调查,Rust 自 2016 年以来(至今已超过 4 年)一直是最受欢迎的语言。我已经关注这门语言有一段时间了,感觉它终于到了一个我认为它稳定的地方——不一定成熟——但稳定。从语法和社区发展的意义上讲是稳定的。因此,在观看了许多 YouTube 视频、阅读文章,甚至测试了各种项目之后,我决定将更多时间投入到 rust 生态系统中,我不得不承认,这很好。
为了您的利益,我应该注意我主要使用的语言是 Python、C、C++ 和 Java; python是我最熟悉的。诚然,Rust 对我的感觉非常不同,我仍在学习基础知识。我不能说我喜欢这种语法。 Rust 没有 OOP 设计范式,令人惊讶的是,由于借用检查器,传递变量很难习惯。
但是,我可以说我喜欢这个编译器,它使用 LLVM 作为其后端,并且有明确的消息来解释什么是错误的。 Rust 提供了开箱即用的惊人工具;例如自动文档生成器、linter、代码格式化程序、包管理器......。它甚至能够在文档字符串中编写测试,并在没有第三方库的情况下运行它们。
我正在通过完成 rustlings 课程来学习 rust。但我也是一个动手学习者——因此这个实验。
翘曲
一个超级简单、可组合的 web 服务器框架,用于提高 warp 速度。
我发现这个 Web 服务器框架与我过去使用的其他框架不同,我将很快尝试几个。无论如何,我很高兴我尝试了 warp,他们正在使用他们称之为“过滤器”的这个功能。它允许使用构建器模式构建您的路线。
let register = warp::post()
.and(warp::path("register"))
.and(warp::body::json())
.and(redis_pool.clone())
.and_then(register);
进入全屏模式 退出全屏模式
上面的代码示例创建了一个路由并将其注册到一个名为“register”的函数中,该函数可以通过以下方式访问。
HTTP
POST /register HTTP/1.1
Host: 192.168.1.2:3030
{
"username": "chmoder",
"password": "password"
}
进入全屏模式 退出全屏模式
对我来说,简洁的要点是您编写将捕获路由的内容并为拦截请求的函数准备数据。
树莓派 4 基准
高层谈话:该服务有“注册”和“登录”两条路线。注册将用户和密码哈希保存到 redis。登录获取用户名的密码。这完全是人为的,作为应用程序没有意义。但它确实让我们看到了我们可以从使用真实数据库的 warp 中获得什么样的性能。
在这个项目中,您将找到 main.rs 和 main-mutex.rs。 main-mutex 是我的第一次迭代。它使用互斥锁在经线线程之间共享 redis 连接。 Main.rs 为每个处理程序提供了一个用于 redis 的 r2d2 连接池。这使我能够从代码中删除一些内容并获得 > 2 倍的性能。
顺便说一下,服务器是在树莓派 4 上编译和运行的,只使用了 23 Mb 的内存。
主互斥体.rs
siege -c100 -r 10 -H 'Content-Type: application/json' 'http://192.168.1.2:3030/login POST { "username": "chmoder","password": "password"}'
进入全屏模式 退出全屏模式
互斥锁版本并没有完全利用 CPU,因为在任何给定时间只有一个进程处于“运行”状态。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--YFQun8pc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur .com/DLneVBm.png)
我们的并发看起来不错,但有些事务需要等待
8.4 秒。
** SIEGE 4.0.4
** Preparing 100 concurrent users for battle.
The server is now under siege...
Transactions: 1000 hits
Availability: 100.00 %
Elapsed time: 37.55 secs
Data transferred: 0.00 MB
Response time: 3.48 secs
Transaction rate: 26.63 trans/sec
Throughput: 0.00 MB/sec
Concurrency: 92.55
Successful transactions: 1000
Failed transactions: 0
Longest transaction: 8.40
Shortest transaction: 0.04
进入全屏模式 退出全屏模式
main.rs
[](https://res.cloudinary.com/practicaldev/image/fetch/s--2AAkDkvG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur .com/LS6esNN.png)
这会将连接池传递给所有线程,充分利用 CPU。这最终使运行时间减少了 2.19 倍,并且在“最长事务”上具有相同的加速。
** SIEGE 4.0.4
** Preparing 100 concurrent users for battle.
The server is now under siege...
Transactions: 1000 hits
Availability: 100.00 %
Elapsed time: 17.10 secs
Data transferred: 0.00 MB
Response time: 1.57 secs
Transaction rate: 58.48 trans/sec
Throughput: 0.00 MB/sec
Concurrency: 91.82
Successful transactions: 1000
Failed transactions: 0
Longest transaction: 3.58
Shortest transaction: 0.07
进入全屏模式 退出全屏模式
继续,查看 GitHub 上的存储库!让我知道您的想法以及您可以进行哪些修改!
更多推荐
所有评论(0)