#zmq #protocols

zedmq

一个轻量级、安全、纯 Rust ØMQ/ZMTP 库实现

8 个版本 (破坏性更新)

0.7.0 2021 年 3 月 21 日
0.6.0 2021 年 3 月 20 日
0.5.0 2020 年 11 月 27 日
0.4.0 2020 年 11 月 27 日
0.1.0 2020 年 11 月 7 日

#763 in 网络编程

MIT 许可证

43KB
950

请注意,这个库处于非常早期的开发阶段!任何一切都可能发生变化!

zedmq

一个轻量级、安全、纯 Rust ØMQ/ZMTP 库实现

索引

简介

Zedmq 是 ØMQ 在 Rust 中的原生实现,专注于

  • 尽可能轻量。
  • 完全安全。
  • 提供简单、阻塞、直观的 API。

这个库是懒惰的且阻塞的,除非调用 recvsend,否则不会执行任何操作。没有“后台”线程或任务代表用户接受新连接或执行重新连接,因此没有共享状态或同步操作。

注意事项

目前这个库只支持通过 TCP 连接套接字,没有可用的绑定行为。

也只实现了少数几种套接字类型:REQ、REP、PULL、PUSH、SUB 和 PUB。

Frame<'_>FrameBuf

这个库还暴露了底层 ZMQ 的帧概念。此外,为了优化目的,对 FrameFrameBuf 类型进行了区分。

从概念上讲,Frame<'_> 等同于 &'_ [u8]&'_ str,而 FrameBuf 的等效类型是 Vec<u8>String。这种区分是为了使“零复制”或“零堆”实践更容易。

REQREP

REQREP 套接字的设计是对称的,并通过类型系统实现安全。

一个 Req 套接字仅具有 .connect.send 方法,其中 .send 会消耗套接字,并返回一个只有 .recv 方法的 ReqPending 套接字,该方法会返回一个多部分消息和 Req 套接字元组。

同样的,对于 Rep 套接字,除了 Rep 具有接收方法 .recvRepPending 具有发送方法 .send 之外。

这种设计是有意的,其价值在于避免了在只允许接收时意外地发送,或者反之亦然,从而避免了意外的“陷阱”。此外,它还消除了运行时检查的开销。

示例

use zedmq::prelude::*;

fn main() -> std::io::Result<()> {
    let mut socket: Pull = zedmq::connect("tcp", "127.0.0.1:5678")?;

    while let Ok(message) = socket.recv() {
        dbg!(message);
    }

    Ok(())
}

与其他库的比较

async? ZMTP类型?
zedmq 否(阻塞) 本地
zmq.rs 是(tokio,async-std) 本地
rust-zmq 是(非阻塞套接字) 否(封装libzmq)

rust-zmq 是一个围绕 C 语言编写的 libzmq 的 Rust 封装,它在其下面执行自己的线程和事件管理,如果您想从 Rust 使用 libzmq,请考虑这一点。

zmq.rs 是 ZeroMQ 社区为了制作一个纯 Rust ZMQ 实现所做的努力,它目前是实验性的,只支持异步,并支持 tokio 和 async-std 运行时。

zedmq,本人,是我尝试用纯 Rust 实现的 ZMQ 库,但我并不想仅仅重复 zmq.rs 的“异步”方法,因为它们已经做得很好了。因此,我受到了 ureq 的启发,在 Rust 中创建了一个具有明显、安全且阻塞的 API 的“简单”ZMQ 库。

与另外两个库相比,zedmq 是最轻量级的(但请注意,它目前是开发最少的)。它不打算与其他两个库竞争,就像 ureq 不打算与 reqwest 或 hyper 竞争一样,它是一个想要给 Rust 用户带来愉悦使用体验的替代解决方案。

它(与 ZMQ 的其他纯实现不同)并没有盲目地复制 libzmq API。相反,你得到一个价格低廉、安全且(希望)有趣的 Rust 库。

许可:MIT

无运行时依赖