中间件—zenoh零基础入门

文章目录

基本概念

zenoh是一个开放的协议,与传统协议仅能覆盖单一协议栈层级不同,Zenoh 的设计从微控制器端无缝跨越至多数据中心云部署------全程仅需一套统一的 API,且线路开销仅为 5 字节,其具有以下特点:

  1. 动态数据:基于位置透明的键值表达式实现订阅/发布消息机制。
  2. 静态数据与计算:一种位置透明的查询/可查询抽象层,基于数据库或按需计算,或两者协作,支持地理分布式的查询。

**动态压缩:**头部字段根据实际值动态省略。例如,若没有附件(Attachment)或时间戳,相关字节完全不发送。

**分片机制:**大数据分片,接收端重组,避免大包阻塞小包

数据格式:

rust 复制代码
[ Header (1-2 bytes) ] [ KeyExpr ID (varint) ] [ Payload Length (varint) ] [ Payload ] [ Timestamp (optional) ] [ Attachment (optional) ]

核心

分层设计

传输层之上构建了一层抽象层,支持多协议同时运行。

TCP/UDP、WebSocket、共享内存(当发布和订阅在同机器,自动切换到共享内存,实现零拷贝)

路由算法

Zenoh 使用基于Key Expression Tree的路由表。每个节点维护一个键空间树,当收到数据包时,根据 KeyExpr 的前缀匹配快速转发。支持多路径路由,自动选择延迟最低或带宽最大的路径。

节点分类

Zenoh 节点分为三种角色,可动态切换:

  1. Client (客户端):普通应用节点。
  2. Peer (对等节点):局域网内自动发现,直连通信,无中心依赖。
  3. Router (路由器):负责跨网段、跨云的路由聚合。

Zenoh通信模型

  1. Pub/Sub

发布订阅模式,支持Qos,支持历史数据回放

  1. Query/Reply

请求/响应模式

机制:客户端发送 Get(key),所有匹配该 Key 的 Queryable 节点返回数据。

优势:支持多播查询(一次请求,多个节点回复),天然适合服务发现和配置读取。

场景:读取最新配置、查询设备状态、联邦学习参数聚合。

  1. Storage/Compute(数据存储)

Storage:节点可以声明自己为某个 Key 的"存储器"。即使发布者离线,订阅者仍可从存储器获取最新值或历史序列。

Compute (Downsampling/Aggregation):可以在路由路径上插入"计算插件"。例如,在网关处自动将 100Hz 的传感器数据降采样为 10Hz 再上传云端,无需修改业务代码。

例子

发布端

rust 复制代码
use zenoh::{key_expr::KeyExpr, Config};
use zenoh::bytes::ZBytes;

#[async_std::main]
async fn main() {
    
    // 配置共享内存
    let mut config = zenoh::Config::default();
    config.insert_json5("transport/shared_memory/enabled", "true");
 
   let image_data: Vec<u8> = vec![0; 1920*1080*3];

    // 创建session
    let session = zenoh::open(config).await.unwrap();

    // let bytes = ZBytes::from(image_data);

    let bytes: ZBytes = image_data.into();

    // session.put("example/topic", bytes)
    //         .await
    //         .unwrap();
    session.put("example/topic", "hello world")
            .await
            .unwrap();
}

订阅端:

rust 复制代码
// use zenoh::prelude::*;
use zenoh::{key_expr::KeyExpr, Config};
use zenoh::bytes::ZBytes;
// 声明在编译期把async fn main展开
#[async_std::main]
async fn main() {
    // config::peer() 生成节点配置
    // unwrap() 解包成功拿到session 失败panic
    let session = zenoh::open(Config::default()).await.unwrap();

    let sub = session.declare_subscriber("example/topic")
                                                .await
                                                .unwrap();


    while let Ok(sample) = sub.recv_async().await {

        // |e|转换失败的错误对象
        let payload = sample
            .payload()
            .try_to_string()
            .unwrap_or_else(|e| e.to_string().into());

        println!(
            "Recv {} on {}: {}",
            sample.kind(),
            sample.key_expr().as_str(),
            payload,
        );
    }

}

官方性能数据

相关推荐
2301_777998341 天前
TCP连接断开:进程终止、主机断电与网络断开
linux·服务器·网络·tcp/ip
星恒随风1 天前
Linux进程基础(二):进程调度、上下文切换、O(1)调度器、环境变量与虚拟地址空间
linux·笔记·学习·状态模式
海盗12341 天前
微软技术日报 2026-10-08:Windows 给智能体立沙箱,Surface 换上 NVIDIA 芯
人工智能·windows·microsoft·机器人·aigc
xbzb1 天前
一边装一边报错:CentOS 7 + LNMP 跑 ECShop 的常见故障与解法
linux·运维·centos
学linux的QQ蛋1 天前
图解 Linux 驱动编译进内核的完整工作流程
linux·运维·服务器
承渊政道1 天前
Linux网络学习【UDP Socket编程实战:网络命令与客户端访问Linux验证】
linux·网络·学习·ubuntu·编程实战·udp socket
鲁邦通物联网1 天前
机器人项目技术标怎么写?机器人梯控架构、调度与验收设计
机器人·巡检机器人·机器人梯控·agv梯控·非侵入式采集·机器人乘梯·机器人自主乘梯
geovindu1 天前
rust: Simple Factory Pattern(续)
后端·设计模式·rust·简单工厂模式·创建型模式
程序员-Benothing1 天前
正则表达式详解:BRE、ERE、PCRE语法与实战案例
linux·运维·服务器
软件架构师-叶秋1 天前
V853方案之ubuntu开发环境搭建
linux·运维·服务器·全志·v853