10 个版本
0.2.12 | 2024年2月24日 |
---|---|
0.2.11 | 2024年2月18日 |
0.2.4 | 2024年1月19日 |
0.1.0 |
|
#725 在 网络编程
337 每月下载量
165KB
3K SLoC
动机
- 项目动机是简化网络通信领域的应用程序代码开发。重点关注性能和人体工程学。
它是如何简化的?
-
传统上,网络 API 提供的方法暴露了对数据非常低级
byte arrays
的访问,而应用层更愿意使用struct
来处理携带应用程序状态信息的结构。 -
Rust 的 std::net 模块也不例外,它将解释
byte array
的责任留给了开发者,需要执行多个步骤来从数组中提取单个字节帧,将其转换为所需的数据结构,同时跟踪剩余的字节并管理许多其他细节。这里的实现细节直接影响应用程序的性能和可靠性。 -
即使在解决了这些细节之后,开发者仍然需要解决许多其他任务,例如
- 如何处理部分读取?
- 是否可以在不同的线程之间拆分读取和写入?
- 如果我将读取拆分到单独的线程,是否可以使用单个线程来管理所有读取?
- ...等等
-
这个库解决了上述挑战,同时提供了一个高性能的网络代码,而不会对应用程序如何使用 API 施加限制。
请提供更多信息
-
从非常高的角度来看,主要概念基于以下两个
struct
:Clt
- 这是一个网络客户端,可以发起连接Svc
- 这是一个网络服务,监听端口并为每个建立的连接创建一个Clt
- 然后
Clt
和Svc
提供具有类似以下签名的send
和recv
方法Clt::send(msg: &T)
与Clt::recv() -> T
- 其中T
是在实例化Clt
和Svc
时指定的泛型类型
-
该库有三种实现。点击单独的链接获取更多详细信息
- 非阻塞 - 目前这种实现最为完整,其
send()
/recv()
方法接受一个timeout
参数。这使得应用开发者可以设置io
等待限制。内部实现依赖于spin
锁,并等待以提供最佳延迟性能,因为它不允许OS
将运行中的线程挂起,这会带来显著的延迟惩罚。这种实现推荐用于对低延迟
性能要求较高的场景。 - 阻塞 - 这种实现使用最简单,因为所有方法调用都是按顺序阻塞,直到操作完成。使用方便的代价是性能和可扩展性。这种实现推荐用于典型的网络负载。
- 异步 - 这种实现基于 Rust 的
async
/await
tokio
框架,然而,在撰写本文时,Rust 的异步 API 仍在进行稳定化,并且尚未在stable
工具链上提供。
- 非阻塞 - 目前这种实现最为完整,其
依赖关系
~1.5MB
~26K SLoC