10个版本 ()

1.0.0-alpha.62024年8月6日
1.0.0-alpha.52024年7月26日
1.0.0-alpha.2 2024年6月21日
0.11.0 2024年6月4日
0.7.0-rc2022年12月22日

#172 in 网络编程

Download history 173/week @ 2024-04-27 7/week @ 2024-05-04 123/week @ 2024-05-11 24/week @ 2024-05-18 2/week @ 2024-05-25 136/week @ 2024-06-01 11/week @ 2024-06-08 51/week @ 2024-06-15 36/week @ 2024-06-22 1/week @ 2024-06-29 80/week @ 2024-07-06 18/week @ 2024-07-13 51/week @ 2024-07-20 94/week @ 2024-07-27 102/week @ 2024-08-03 9/week @ 2024-08-10

每月257次下载

EPL-2.0 OR Apache-2.0

57KB
907

CI Discussion Discord License License

Eclipse Zenoh

Eclipse Zenoh:零开销Pub/sub,存储/查询和计算。

Zenoh(发音为/zeno/)统一了数据流动、静态数据和计算。它巧妙地将传统的pub/sub与地理分布式存储、查询和计算相结合,同时保持了超越任何主流堆栈的时间效率和空间效率。

请访问网站 zenoh.io路线图 以获取更多信息。


文件系统后端

在zenoh中,后端是一种存储技术(如DBMS、时间序列数据库、文件系统等),允许通过zenoh存储键/值发布并返回查询。有关详细信息,请参阅zenoh文档

此后端依赖于主机的文件系统来实现存储。Zenoh将依赖于以下名称(不带操作系统特定的前缀和扩展名)来查找和加载它:zenoh_backend_fs

👉 安装最新版本:请参阅以下内容

👉 构建"main"分支:请参阅以下内容


使用示例

先决条件

  • 您已安装zenoh路由器(zenohd),并且zenoh_backend_fs库文件位于~/.zenoh/lib
  • 声明ZENOH_BACKEND_FS_ROOT环境变量到您想要存储文件(或公开)的目录。如果您不声明它,将使用~/.zenoh/zenoh_backend_fs目录。

您可以通过配置文件在 Zenoh 路由启动时设置存储,也可以在运行时通过 Zenoh 管理空间,例如使用 REST API 来设置。

通过 JSON5 配置文件设置

  • 创建一个包含以下内容的 zenoh.json5 配置文件
    {
      plugins: {
        // configuration of "storage-manager" plugin:
        storage_manager: {
          volumes: {
            // configuration of a "fs" volume (the "zenoh_backend_fs" backend library will be loaded at startup)
            fs: {},
          },
          storages: {
            // configuration of a "demo" storage using the "fs" volume
            demo: {
              // the key expression this storage will subscribes to
              key_expr: "demo/example/**",
              // this prefix will be stripped from the received key when converting to file path
              // this argument is optional.
              strip_prefix: "demo/example",
              volume: {
                id: "fs",
                // the key/values will be stored as files within this directory (relative to ${ZENOH_BACKEND_FS_ROOT})
                dir: "example"
              }
            }
          }
        },
        // Optionally, add the REST plugin
        rest: { http_port: 8000 }
      }
    }
    
  • 使用以下命令运行 Zenoh 路由
    zenohd-c zenoh.json5

通过 curl 命令在管理空间中设置

  • 运行 Zenoh 路由,并具有对其管理空间的写入权限:zenohd --adminspace-permissions rw
  • 添加 "fs" 后端(将加载 "zenoh_backend_fs" 库)
    curl -XPUT -H 'content-type:application/json' -d '{}'http://localhost:8000/@/router/local/config/plugins/storage_manager/volumes/fs
  • 使用 "fs" 后端添加 "demo" 存储
    curl -XPUT -H 'content-type:application/json' -d '{key_expr:"demo/example/**",strip_prefix:"demo/example", volume: {id: "fs", dir:"example"}}'http://localhost:8000/@/router/local/config/plugins/storage_manager/storages/demo

使用 REST API 进行测试

使用 curl 发布和查询密钥/值,您可以

# Put values that will be stored under ${ZENOH_BACKEND_FS_ROOT}/example
curl -X PUT -d "TEST-1" http://localhost:8000/demo/example/test-1
curl -X PUT -d "B" http://localhost:8000/demo/example/a/b

# Retrive the values
curl http://localhost:8000/demo/example/**

配置

基于文件系统的卷的额外配置

使用 fs 后端的卷不需要在卷级别进行任何额外配置。任何卷都可以通过指定 backend 配置键的值为 "fs" 来使用 fs 后端。如果没有指定其他后端,名为 fs 的卷将自动由 fs 后端支持。


基于文件系统的卷的存储级别配置

依赖于 fs 支持的卷的存储必须/可以指定对该卷特定的额外配置,如上例所示

  • dir必需,字符串):用于存储数据的目录。

  • read_only(可选,布尔值):存储将只对 GET 查询做出响应。它将不接受任何 PUT 或 DELETE 消息,并且不会写入任何文件。默认值为 false

  • on_closure(可选,字符串):当存储被删除时使用的策略。有两个选项

    • "do_nothing":存储的目录保持不变(这是默认行为)
    • "delete_all":删除存储的目录及其所有内容。
  • follow_links(可选,布尔值):如果设置为 true,存储将跟踪符号链接。默认值为 false

  • keep_mime_types(可选,布尔值):当对文件执行 GET 查询,并且 Zenoh 编码未知时,存储将根据文件扩展名猜测其 MIME 类型。如果 MIME 类型不对应于支持的 Zenoh 编码,则此选项将驱动返回值

    • true(默认值):返回一个带有描述设置为 MIME 类型的 Custom value
    • false:返回一个使用 APP_OCTET_STREAM 编码的 Raw value

后端的行为

映射到文件系统

每个存储将映射到一个路径为:${ZENOH_BACKEND_FS_ROOT}/<dir>的目录,其中

  • ${ZENOH_BACKEND_FS_ROOT}是一个环境变量,可以在启动zenoh路由器之前指定。如果没有指定这个变量,将使用${ZENOH_HOME}/zenoh_backend_fs(其中${ZENOH_HOME}的默认值是~/.zenoh)。
  • <dir>是存储创建时指定的"dir"属性。每个放入存储的zenoh 键/值将映射到存储目录中的一个文件,其中
  • 文件路径将是${ZENOH_BACKEND_FS_ROOT}/<dir>/<relative_zenoh_key>,其中<relative_zenoh_key>将是zenoh键,在存储创建时从"strip_prefix"属性中去除。
  • 文件的内容将是作为RawValue写入的值。也就是说,这是zenoh传输的相同的字节数据缓冲区。对于与UTF-8兼容的格式(StringUTF8、JSon、Integer、Float...),这意味着文件将以文本格式可读。
  • 键/值的编码和时间戳将存储在存储目录中的RocksDB数据库中。

删除时的行为

在删除键时,相应的文件将被删除。在RocksDB数据库中插入一个具有删除时间戳的条目(以避免在无序消息的情况下重新插入较旧时间戳的点)。
在常规间隔中,一个任务将清除RocksDB数据库中具有旧时间戳且没有相应现有文件的条目。

GET时的行为

在GET操作中,存储将搜索匹配的现有文件,并作为回复返回它们的原始内容。对于每个文件,从RocksDB数据库中检索编码和时间戳。但如果没有在数据库中找到文件的条目(例如,对于没有使用zenoh创建的文件),将根据文件的扩展名(使用mime_guess)推断编码,并从文件的修改时间推断时间戳。


如何安装它

要安装此后端库的最新版本,可以按以下方式操作

手动安装(所有平台)

所有发布包都可以从以下网址下载

每个子目录都有Rust目标的名称。请参阅https://doc.rust-lang.net.cn/stable/rustc/platform-support.html中每个目标对应的平台。

选择您的平台,并下载.zip文件。
将其解压到与 zenohd 相同的目录,或者任何它可以找到后端库的目录(例如 /usr/lib 或 ~/.zenoh/lib)

Linux Debian

将 Eclipse Zenoh 私有仓库添加到源列表,并安装 zenoh-backend-filesystem 软件包

echo "deb [trusted=yes] https://download.eclipse.org/zenoh/debian-repo/ /" | sudo tee -a /etc/apt/sources.list.d/zenoh.list > /dev/null
sudo apt update
sudo apt install zenoh-backend-filesystem

如何构建它

⚠️ 警告 ⚠️ : Zenoh 及其生态系统正在积极开发中。当你从 git 构建时,请确保同时从 git 构建你计划使用的任何其他 Zenoh 仓库(例如,绑定、插件、后端等)。可能会发生 git 中的某些更改与最新发布的 Zenoh 软件包(例如 deb、docker、pip)不兼容的情况。我们在维护 Zenoh 项目的各个 git 仓库之间的兼容性方面投入了特别多的努力。

首先,安装 ClangCargo 和 Rust。如果你已经安装了 Rust 工具链,请确保它与以下版本兼容

$ rustup update

⚠️ 警告 ⚠️ : 由于 Rust 没有稳定的 ABI,后端库应该使用与 zenohd 完全相同的 Rust 版本构建,并且对于 zenoh 依赖项使用相同的版本(或提交号)。否则,在 zenohd 和库之间共享类型内存映射的不兼容性可能导致 "SIGSEV" 崩溃。

要了解 zenohd 构建所使用的 Rust 版本,请使用 --version 选项。
示例

$ zenohd --version
The zenoh router v0.6.0-beta.1 built with rustc 1.64.0 (a55dd71d5 2022-09-19)

在这里,zenohd 是使用 rustc 版本 1.64.0 构建的。
使用以下命令安装并使用此工具链

$ rustup default 1.64.0

并且 zenohd 版本对应于一个未发布的提交,其 id 为 1f20c86。使用以下命令更新 Cargo.lock 中的 zenoh 依赖项

$ cargo update -p zenoh --precise 1f20c86

然后使用以下命令构建后端

$ cargo build --release --all-targets

依赖项

~64MB
~1M SLoC