mrkeyoor.com_
Thu 17 Sept 16:01 UTC
Dataevaluationupdated 17 Sept 2026

zenoh review

Zenoh is a networking system that combines publish and subscribe messaging with queries, storage, and remote computation over one key space. This repository contains the Rust library, the `zenohd` router, extension crates, plugins, and examples; bindings for most other languages live in separate repositories.

Verdict

Our Zenoh run built in 406 seconds, then 164 of 166 cargo tests passed before the 757-second test command exited with code 101. Evaluate it when pub/sub alone is too narrow and the same edge network must also answer queries or reach stored data. Do not make the protocol decision from the quick examples: test your topology, plugin build discipline, failure recovery, and the two failing cases against the exact release you plan to ship.

We ran it

Lab card: what happened when we ran zenohScreenshot of zenoh (zenoh.io)
Install✓ · 26s526 packages
Build✓ · 406s
Tests✗ · 757s164 passed · 2 failed of 166 (cargo test)
Repo790 files~214,777 lines of source · 8 MB · 8 CI workflows

Answers from our run

Does zenoh build from source?

Dependencies installed in 26 seconds (526 packages), and the build succeeded in 406 seconds. We cloned commit 9fcd9cb into a clean Debian container with 3 CPUs and no project-specific setup.

Do zenoh's tests pass?

Not all of them: 164 of 166 passed and 2 failed when we ran the project's own test command (cargo test). Some failures need services or credentials a bare container does not have.

Who should not use zenoh?

Teams whose release gate requires a clean full suite on the measured commit: our cargo test run ended with 164 passed and 2 failed out of 166.

What are the alternatives to zenoh?

NATS Server, Eclipse Mosquitto, Eclipse Cyclone DDS. Our Zenoh run built in 406 seconds, then 164 of 166 cargo tests passed before the 757-second test command exited with code 101.

Setup2/5406-second build and 757-second suite ended with 2 failures
Docs4/5Clear crate, router, plugin, feature, and language boundaries
Community4/53,201 stars with same-day push and issue activity in September 2026
Maturity3/5Active 1.10.1 release, but our suite and current runtime reports matter

Who it’s for

Edge, robotics, and distributed-systems teams that need pub/sub plus query and storage access across one network.
Rust developers who want to embed a Zenoh session directly in an application.
Operators who need a standalone router with explicit listeners, peer connections, REST access, or storage plugins.
ROS 2 or DDS users willing to operate a bridge and evaluate Zenoh's routing model.

Who it’s NOT for

Teams whose release gate requires a clean full suite on the measured commit: our cargo test run ended with 164 passed and 2 failed out of 166.
Contributors who need a quick edit-build-test loop: our build took 406 seconds and tests ran for 757 seconds after 526 packages were installed.
Operators expecting dynamic Rust plugins to be independently upgradeable: the router README requires the exact same Rust version, Zenoh commit or version, and feature set.
Applications pinned below Rust 1.75: the README sets 1.75 as the minimum and warns that some unlocked dependencies may require newer compilers.
Teams wanting every supported language in one repository: the README sends C, C++, Python, Kotlin, Java, TypeScript, and Go users to separate projects.
Organizations that only need a conventional MQTT broker and already have MQTT clients: Zenoh introduces its own key expressions, query model, routing, and operational choices.

Setup reality

Our sandbox installed 526 Rust packages in 26 seconds. The build succeeded in 406 seconds, then tests failed with exit code 101 after 757 seconds: 164 passed and 2 failed out of 166. The log tail names callback_drop_on_undeclare, where one target reported 13 passed and 1 failed.

Local examples need a current Rust toolchain, with 1.75 documented as the minimum. Basic sessions require no hosted account or secret. Routed deployments need listener and peer endpoints, discovery choices, and any authentication or transport configuration your network requires.

Shared memory is an opt-in crate feature. Dynamic router plugins must match the router's Rust compiler, Zenoh version or commit, and feature set. The repository has no Dockerfile, so the source build does not supply a canonical container environment.

One key space carries messages, queries, and stored data

Zenoh uses the same named data space for publish and subscribe traffic, query and reply, storage, and computation. That is the decision-making fact. A sensor can publish a value, another participant can subscribe, and a queryable can answer a request without introducing a separate API vocabulary for every path. Teams already stitching together a message broker, service calls, and an edge cache may find that model easier to reason about. Teams with one simple queue probably will not.

The Rust repository contains the primary zenoh crate, zenoh-ext, the zenohd router, plugin support, internal common crates, and examples. Public stability applies to zenoh and zenoh-ext; the README says internal commons APIs may change at any time. Advanced publisher and subscriber types add stronger delivery behavior, while serialization in the extension crate is intended to work across bindings. Each feature deserves a workload test because the README's architecture description is not a latency guarantee.

Zenohd can listen, connect, discover, and host plugins

The router accepts repeated listen and connect endpoints, a JSON5 or YAML configuration, and a unique identifier of up to 16 bytes. By default it answers multicast scouting, while a flag disables that behavior. This gives operators a choice between local discovery and explicit topology. Networks that filter multicast will need configured endpoints or another reachable router path; container and cloud layouts should be tested with the real network policy.

Zenohd also manages plugins and can expose REST or storage functions through its bundled components. A requested plugin that fails to load makes the router exit, which is preferable to quietly running without a required service. The admin space defaults to read-only permissions, and command-line overrides can change nested configuration. Treat that configuration as production infrastructure: pin it, validate it, and keep write access away from clients that only need status.

What happened when we ran it

Our sandbox installed 526 Rust packages in 26 seconds for commit 9fcd9cb. The repository then built successfully in 406 seconds. The checkout was 8 MB with 790 files and about 214,777 lines of source. Those figures make Zenoh a substantial contributor build despite the compact checkout. The repository had 8 CI workflow files, no Dockerfile, and no tests directory in the supplied repository signal.

Cargo tests ended with exit code 101 after 757 seconds. The supplied summary counted 164 passed and 2 failed out of 166. In the log tail, callback_drop_on_undeclare reported 13 passed and 1 failed, then Cargo printed the command for rerunning that integration test. The tail does not identify the other failure or explain a cause, so the defensible result is simply that the complete suite did not pass in our fresh 3-CPU, 12 GB sandbox.

Several other groups shown in the tail passed, including groups of 40, 10, 6, 4, 2, and 7 tests. That does not cancel the red overall exit. A team evaluating Zenoh should rerun the named target on its deployment kernel and network settings, then run the full suite again. Callback cleanup and undeclaration touch lifecycle behavior, so a passing publish-and-subscribe demo is not a substitute for that check.

Dynamic plugins must match 3 build dimensions exactly

The router documentation gives a blunt compatibility rule: a dynamic plugin should use the same Rust version, the same Zenoh version or commit, and the same feature set as zenohd. Rust has no stable ABI for sharing these structures. The README warns that a mismatched plugin may be rejected, and an unchecked memory-layout mismatch can end in a segmentation fault. Package the router and plugins as one tested unit rather than upgrading either side independently.

The compiler floor has a second wrinkle. Zenoh itself supports stable Rust 1.75 or newer, but the main crate does not pin every dependency to that compiler because exact pins can create downstream conflicts. The repository supplies a separate pinned-dependencies crate for Rust 1.75 compatibility. If an organization fixes compiler versions for certification or long-lived devices, reproduce dependency resolution from a lockfile and verify every enabled feature before promising that floor.

Eight language APIs live across separate projects

The README links 8 language families: Rust here, two C options, plus C++, Python, Kotlin, Java, TypeScript, and Go. Most are bindings to the Rust implementation; zenoh-pico is the pure C exception. The TypeScript package is a WebSocket client for a router plugin. Language support therefore involves several repositories, release trains, and packaging systems rather than one monorepo build. Check feature parity and release compatibility for the binding you will actually deploy.

Bridges add another boundary. Separate plugins connect Zenoh to DDS and ROS 2 communications, while other repositories provide a web server and remote TypeScript API. This is useful when the network already has those systems, but a bridge is another process with configuration and version constraints. Choose Zenoh because its data model solves a topology problem, then treat each bridge as its own production dependency.

Three current reports concern router or shared-memory state

Issue 2800 reports a shared-memory provider stuck in an initializing state when requested before it is ready on version 1.10.1. Issue 2788 reports a failed shared-memory attach or memory lock dropping a sample and leaving partial metadata. Issue 2780 describes a router that stopped accepting new connections after restart while remaining alive. These are specific reports, not proof that every deployment will encounter the same conditions, but they belong in soak and recovery tests.

GitHub recorded 3,201 stars, 302 combined open issues and pull requests, and a last push on September 17, 2026. Release 1.10.1 shipped on September 7 with a new transport API method and fixes for scouting, REST content types, and pending connections. The same-day repository activity shows active maintenance. The 406-second build, failed 757-second suite, and exact-match plugin rule still make adoption an engineering commitment rather than a broker swap.

Alternatives

ProjectWhat it isPick it when
NATS Server gh↗A server for subject-based messaging with request-reply and persistence options.pick this instead when application messaging and a conventional server-centered deployment are the main requirements.
Eclipse MosquittoA compact broker for the MQTT protocol and its existing client ecosystem.pick this instead when MQTT compatibility matters more than Zenoh's combined query, storage, and routing model.
Eclipse Cyclone DDSAn Eclipse implementation of DDS for data-centric real-time systems.pick this instead when direct DDS compatibility and its quality-of-service model are fixed requirements.

What people are saying

  1. [github-trending] eclipse-zenoh/zenoh

Sources

  1. Eclipse Zenoh repository and README
  2. Zenoh 1.10.1 release
  3. Zenoh router and plugin documentation
  4. Shared-memory provider initialization report
  5. Shared-memory attach failure report
  6. Router restart connection report

More data reviews

fonts · cockroach · dbt · GeoLibre · TradingView-API · os-taxonomy · the whole board →