Eclipse SDV Projectを調べていたら、 zenoh というのが出てきた。
見てみるとROS界隈でも使われている軽量スタックだったので、調べて見ようと思いました。
zenohとは
Zero Network Overhead Protocolからzenohと名付けているようです。
サイトを見るとZeroOverHead Network Protocolになっているため、あれ?って部分はありますが。
主な機能
機能としては
- Pub/Sub
- Storages
- Queries and Queryables
があります。
また、トポロジー構成は
- Peer-to-Peer
- Clique , Mesh トポロジを構築
- Brokered
- zenoh routerで複数clientを接続
- Routed
- routerを構築し、client間や別subnetを接続
が実現できるようです。参照:https://zenoh.io/docs/getting-started/deployment/
非機能的な要素として
- Scalable
- Scalable Routing
- Low Power Networks
- Constrained Devices
- Fast
- Fast Adoption
- Low Latency
- High Throughput
とあり、マイコンからクラウドまでサポートしているとのこと。
C言語で実装されたzenoh-picoもあります。
パフォーマンス
以下のブログでパフォーマンスについて言及されています。
https://zenoh.io/blog/2023-03-21-zenoh-vs-mqtt-kafka-dds/
MQTTよりも性能があることが示されています。
とはいえ、MQTTは低スペックや不安定なネットワーク向けだから同じ土俵に乗せるのもと思うが。
拡張性
プラグインを使う事により、様々なミドルウェアと接続することが可能になります。
- mqtt
- dds
- rocksdb
- filesystem
- influxdb
- s3
- webserver
- sql
などがあり、自作で拡張することが可能です。
動作確認
簡単なpub/subの動作確認の手順です。
- z_sub とz_pubをビルド
$ git clone https://github.com/eclipse-zenoh/zenoh.git
$ cd zenoh/examples
$ cargo build --example z_sub
$ cargo build --example z_pub
subscriberの実行
$ ../target/debug/examples/z_sub
Opening session...
Declaring Subscriber on 'demo/example/**'...
Press CTRL-C to quit...
>> [Subscriber] Received PUT ('demo/example/zenoh-rs-pub': '[ 1] Pub from Rust!')
>> [Subscriber] Received PUT ('demo/example/zenoh-rs-pub': '[ 2] Pub from Rust!')
>> [Subscriber] Received PUT ('demo/example/zenoh-rs-pub': '[ 3] Pub from Rust!')
>> [Subscriber] Received PUT ('demo/example/zenoh-rs-pub': '[ 4] Pub from Rust!')
publisherの実行
$ ../target/debug/examples/z_pub
Opening session...
Declaring Publisher on 'demo/example/zenoh-rs-pub'...
Press CTRL-C to quit...
Putting Data ('demo/example/zenoh-rs-pub': '[ 0] Pub from Rust!')...
Putting Data ('demo/example/zenoh-rs-pub': '[ 1] Pub from Rust!')...
Putting Data ('demo/example/zenoh-rs-pub': '[ 2] Pub from Rust!')...
Putting Data ('demo/example/zenoh-rs-pub': '[ 3] Pub from Rust!')...
Putting Data ('demo/example/zenoh-rs-pub': '[ 4] Pub from Rust!')...
こんな感じで簡単に動かせます。
routerを使ったサンプルは別の投稿でかければと思います。
使ってみた感想
機能としては未知数なところもあるが、ROS2で使われている&色々拡張できるという面で 非常に期待しているミドルウェアではあります。
uProtocol というミドルウェアでも使われているということなので、そこでも調べてみようかと思います。
参考サイト
以下参考にしたサイトです。
- https://zenoh.io/
- https://www.zettascale.tech/
- https://zenoh.io/docs/getting-started/deployment/
- https://qiita.com/Shintaro_Hosoai/items/0bde489cde43a00d6f96
- https://github.com/eclipse-zenoh/zenoh/tree/master
- https://speakerdeck.com/takasehideki/zenohnoros-2xiang-kedui-ying-noxian-zhuang-tofang-xiang-xing-just-my-thought