10个版本

0.2.12 2024年2月24日
0.2.11 2024年2月18日
0.2.4 2024年1月19日

#13 in #ergonomics

Download history 60/week @ 2024-04-02

383 每月下载量
用于 ouch_bindings_python

自定义许可

295KB
4.5K SLoC

动机

  • 项目的动机是简化网络通信领域的应用程序代码开发。重点关注性能和易用性。

它是如何简化的?

  • 传统上,网络API提供的方法暴露了对非常低级的数据(字节数组)的访问,而应用层更愿意与携带应用程序状态信息的结构体(struct)一起工作。

  • Rust的std::net模块并非例外,它将解释字节数组的责任留给开发者,开发者需要执行一系列步骤来从数组中提取单个字节数据帧,将其转换为所需的数据结构,同时跟踪剩余的字节并管理很多其他细节。这里的实现细节对应用程序性能和可靠性有直接影响。

  • 即使解决了这些细节,开发者仍需解决许多其他任务,例如

    • 如何处理部分读取?
    • 能否在不同线程之间拆分读写操作?
    • 如果我将读取拆分到单独的线程,能否使用单个线程来管理所有读取?
    • ...等等
  • 这个库解决了上述挑战,同时提供了高性能的网络代码,而不限制应用程序如何使用API。

请告诉我更多

  • 从非常高的角度来看,主要概念基于以下两个结构体(struct)

    • Clt - 这是一个网络客户端,可以发起连接
    • Svc - 这是一个网络服务,它监听一个端口并为每个建立的连接创建一个Clt
    • 然后,CltSvc都提供了sendrecv方法,其签名大致如下
      • Clt::send(msg: &T)Clt::recv() -> T - 其中 T 是在实例化 CltSvc 时指定的泛型类型
  • 本库有三个实现。点击单独的链接获取更多详细信息

    • 非阻塞 - 目前这个实现是最完整的,其 send()/recv() 方法接受一个 timeout 参数。这使得应用程序开发者可以设置 io 等待限制。内部实现依赖于 spin 锁并等待以提供 best 延迟性能,因为它不允许 OS 将运行线程挂起,这会产生显著的延迟惩罚。这种实现推荐用于对 low latency 性能要求的情况。
    • 阻塞 - 这个实现最简单易用,因为所有方法调用都是按顺序阻塞,直到操作完成。这种易用性是以性能和可扩展性为代价的。这种实现推荐用于典型网络负载。
    • 异步 - 这个实现基于 Rust 的 async/await tokio 框架,然而,在撰写本文时,Rust 的异步 API 仍在进行稳定化,并且尚未在 stable 工具链中可用。

依赖关系

~6–19MB
~212K SLoC