Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ドメイン内直接通信を実現するElixir/NervesのDDS実装 - BDDS

ドメイン内直接通信を実現するElixir/NervesのDDS実装 - BDDS

本資料は、ITRC RICC-PIoT workshop 2022での発表資料です。

さくらインターネット研究所(菊地)は他大学等と共同でNICTのBeyond 5Gシーズ創出型プログラムの研究委託「関数型パラダイムで実現するB5G時代の資源透過型広域分散コンピューティング環境」を共同で受託し、関数型言語のElixirをベースにしたエッジ・Fog型のコンピューティング環境実現に向けた研究開発を実施している。

本検討では、クラウドとエッジ・エンドを統合し、Fog的に(=面的に)扱えるアプリケーション実行環境を構築することを目指し検討を進めている。ここでは、Elixir/NervesにDDS(Data Distribution Service)を組み込み、分散通信ミドルウェアとして成立させる実装をしたので紹介する。

なお、本研究成果の一部は、国立研究開発法人情報通信研究 機構の委託研究(04001)により得られたものです。

KIKUCHI Shunsuke

March 01, 2022
Tweet

More Decks by KIKUCHI Shunsuke

Other Decks in Research

Transcript

  1. ドメイン内直接通信を実現する Elixir/NervesのDDS実装 - BDDS ITRC RICC-PIoT workshop 2022 2022/03/01 (C)

    Copyright 1996-2022 SAKURA Internet Inc さくらインターネット研究所 上級研究員 菊地俊介 さくらインターネット株式会社
  2. 話者紹介 2 菊地 俊介 (東京都出身) 所属 さくらインターネット研究所 学歴 早稲田大学大学院 理工学研究科

    電子・情報通信学専攻 修士課程修了 早稲田大学大学院 国際情報通信研究科 博士課程単位取得退学 職歴 富士通(株)富士通研究所に就職 ネットの研究やったり、SEやったり、NICTに出向したり、 トイレIoT作ったり さくらインターネットに転職 データ流通(FIWARE, NGSI)、OpenFogコンソーシアム(標準化)、 量子(アニーリング)コンピュータ、 AR/VR、モビリティ、RISC-V 専門 エッジ・Fogコンピューティング(分散系システムのあたり) ビジョナリーとして技術・社会、会社の将来を思い描く 趣味 新技術調査、読書、最近はガンプラ作り @kikuzokikuzo https://note.mu/kikuzokikuzo https://www.facebook.com /kikuzokikuzo
  3. はじめに • さくらインターネット研究所(菊地)は、東京大学 高瀬先生、高知工科 大学 菊池先生、大阪大学 中川先生、シティネット(高知)西内さん、大 崎さん、NII 柏崎先生と、NICTのBeyond 5Gシーズ創出型プログラムの

    研究委託「関数型パラダイムで実現するB5G時代の資源透過型広域分散コ ンピューティング環境」を共同で受託し、関数型言語のElixirをベースに したエッジ・Fog型のコンピューティング環境実現に向けた研究開発を実 施している。 3 • クラウドとエッジ・エンドを統合し、Fog的に(=面的に)扱えるアプ リケーション実行環境を構築する。実装にはElixir言語環境を用いる。 • Elixir/NervesにDDS(Data Distribution Service)を組み込み、分散 通信ミドルウェアとして成立させる。 • 本資料の構成 • 「関数型パラダイムで実現するB5G時代の資源透過型広域分散コンピュー ティング環境」受託内容と、そこでの通信ミドルウェア層のねらい • DDSとElixir/Nerves • BDDS - Bindings for DDS (Elixir/Nerves向けCyclone DDS組み込み実装) のご紹介
  4. 関数型パラダイムで実現するB5G時代の資源透過型広域分散コンピューティング環境 (検討初期の)想定システムアーキテクチャ • クラウド・MEC・エッジ・現場デバイスにシームレスな分散プラット フォーム • アプリケーションの分散実行(タスク配分アルゴリズム) • 実証アプリ 4

    :最適配分アルゴリズム :IoTノードの計算資源 :資源透過型の分散処理プラットフォーム ① :IoTノードの能率的な実行環境 ② :計算資源配分の決定手法 ③ :実証評価向けアプリケーション ④ :透過型分散プラットフォーム :BEAM(Elixir処理系) MEC BEAM クラウド BEAM エッジ BEAM 最適配分アルゴリズム 透過型分散プラットフォーム BEAM システム開発者 デプロイされる コード ① ③ ② ③ ③ ❤ 評価アプリ ❤ 評価アプリ ④ ④ ❤ 評価アプリ ④ ② ② ❤ 評価アプリ ④ ② ② ② ②
  5. Elixir / Nerves でのデバイス・エッジ間接続 • Elixir/Nervesをデバイス・エッジ間に分散適用する • エンドデバイス間通信の実現 • クラウド(エッジの代替)との通信の実現

    6 VM Hardware Hardware App OS Hardware エンドデバイス エンドデバイス (拠点内ハブ) クラウド (エッジ代替) Hypervisor OS OS BEAM App App BEAM BEAM Hardware App OS BEAM エンドデバイス
  6. エンドデバイス間での折返し通信における課題 7 エンドデバイス間折返しで通信できるか? • 素のElixirでは、通信はできるが相手ノードアドレスの明示的な設定が必要。 • Wi-Fi(=DHCP)環境ではアドレス指定が困難→デバイスディスカバリ機能が必要 • →DDS(Data Distribution

    Service)を導入する • DDSは、トピック指定のみで、通信先ノードアドレスを指定しなくても通信が可能 Hardware Hardware App エンドデバイス エンドデバイス (拠点内ハブ) OS (Buildroot) OS (Buildroot) BEAM App BEAM Hardware App OS (Buildroot) BEAM エンドデバイス Hardware Hardware App エンドデバイス エンドデバイス (拠点内ハブ) OS (Buildroot) OS (Buildroot) BEAM App BEAM Hardware App OS (Buildroot) BEAM エンドデバイス 明示的な指定が 必要 DDS
  7. Elixir / NervesにCyclone DDSを組み込む • Elixir / NervesにCyclone DDSを組み込む:BDDS •

    Elixirには外部ライブラリ呼び出し機能 Nif : Native Implemented Functions がある。 • DDS : Pub/Sub型通信ミドルウェア。 • Cyclone DDS : EclipseプロジェクトによるDDSの実装の一 つ。シェアを伸ばしている。ROS2の次期通信ミドルウェア として採用が決定。 • https://github.com/eclipse-cyclonedds/cyclonedds • https://projects.eclipse.org/projects/iot.cyclonedds • Bindings for DDS : CycloneDDSを呼び出すElixirのNif実装 • Cyclone DDSを下位モジュールとして自動で組み込み、かつNifを利 用して呼び出せるようにしたパッケージ • (現状コンセプト実証モデルで、フル機能は未実装) • https://github.com/b5g-ex/bdds 8
  8. BDDS : CycloneDDS NIF実装のプロトコルスタック構成とインストール • CycloneDDSをNIF経由でElixir(Erlang)から呼び出すことができる 9 CycloneDDS BDDS App

    VM Linux Kernel iEX (Elixir Shell) ERTS (Erlang Run-Time System) vagrant@ubuntu-bionic:~$ sudo apt-get install bison vagrant@ubuntu-bionic:~$ git clone https://github.com/eclipse- cyclonedds/cyclonedds.git vagrant@ubuntu-bionic:~$ cd cyclonedds vagrant@ubuntu-bionic:~/cyclonedds$ cd build vagrant@ubuntu-bionic:~/cyclonedds/build$ cmake - DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_EXAMPLE=ON .. vagrant@ubuntu-bionic:~/cyclonedds$ sudo cmake --build . --target install CycloneDDSのインストール vagrant@ubuntu-bionic:~$ mix nerves.new bddstest vagrant@ubuntu-bionic:~$ export MIX_TARGET=rpi4 vagrant@ubuntu-bionic:~$ cd bddstest vagrant@ubuntu-bionic:~/bddstest$ vi mix.exs vagrant@ubuntu-bionic:~/bddstest$ mix deps.get vagrant@ubuntu-bionic:~/bddstest$ mix firmware vagrant@ubuntu-bionic:~/bddstest$ mix firmware.burn BDDSのインストール(Nerves環境下での場合)
  9. 通信の様子(プロトタイプ環境でのもの) • ノード間で通信が可能 • 相手先IPアドレスを指定せず通信できることを確認 10 vagrant@ubuntu-focal:~/ddstest$ iex -S mix

    Erlang/OTP 24 [erts-12.1.5] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async- threads:1] [jit] Interactive Elixir (1.12.3) - press Ctrl+C to exit (type h() ENTER for help) iex(1)> Ddstest.load_nif :ok iex(2)> Ddstest.create_publisher Waiting for dds publication match... 0 iex(3)> Ddstest.sendmsg('hoge') 'hoge' iex(4)> vagrant@ubuntu-focal:~/ddstest$ iex -S mix Erlang/OTP 24 [erts-12.1.5] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async- threads:1] [jit] Interactive Elixir (1.12.3) - press Ctrl+C to exit (type h() ENTER for help) iex(1)> Ddstest.load_nif :ok iex(2)> Ddstest.create_subscriber === [Subscriber] Waiting for a sample... === [Subscriber] Received : hoge 0 iex(3)> Publisher側 Subscriber側 (現状、topic固定、メッセージ型もtextのみ、など制約あり。)
  10. Elixir + DDSで何がうれしいのか? 11 →拠点内でノードが増えたり減ったりしたときに、個々のノードの通 信設定を変更しなくてよい • センサやアクチュエータが増えたりしたときに、そのつながりを手動管理しなくてよい • データ参照権限の管理をハブノードで実施する場合でも、ハブノードへの接続設定が不要

    Hardware Hardware App エンドデバイス エンドデバイス (拠点内ハブ) OS (Buildroot) OS (Buildroot) BEAM App BEAM Hardware App OS (Buildroot) BEAM エンドデバイス Hardware App OS (Buildroot) BEAM エンドデバイス VM OS クラウド Nerves -Hub 既存ノードへの 設定変更不要 (OTA) (管理マネージャ)
  11. 要検討項目 • 現状のElixirへのCyclone DDS組み込み実装(下記の右図)は、単純なデュ アルスタック構成であり、Elixirの良さを活かせていない可能性が高い • Elixirの良さ => Node.connectを用いる、プログラムの書きやすさ、並列動作性能 など

    • DDSのメリット(デバイスディスカバリ)は活かせる • 両者の性能差など評価していく予定 12 Hardware App Linux Kernel iEX (Elixir Shell) BEAM ERTS Hardware App Linux Kernel iEX (Elixir Shell) ERTS シームレスなプログラミングの実現 Hardware App Linux Kernel iEX (Elixir Shell) ERTS pub/sub DDSの流儀で、 他のノードと通信 できる(ROS2 ノード含む) 現状のCycloneDDSを 組み込んだ実装 Elixirでのノード間通信 (Node.connect) CycloneDDS bdds
  12. その次の目標 • Elixir/Nervesをデバイス・エッジ間に分散適用する • エンドデバイス間通信の実現 • クラウド(エッジの代替)との通信の実現 13 VM Hardware

    Hardware App OS Hardware エンドデバイス エンドデバイス (拠点内ハブ) クラウド (エッジ代替) Hypervisor OS OS BEAM App App BEAM BEAM Hardware App OS BEAM エンドデバイス エンドデバイス・ エッジ間接続
  13. まとめ • クラウドとエッジ・エンドを統合し、Fog的に(=面的に)扱え るアプリケーション実行環境をElixirで構築する。 • Elixir/NervesにDDS(Data Distribution Service)を利用した 分散通信ミドルウェアとして成立させる。 •

    1st Stepとして、拠点内でのエンドデバイス間通信に注目 • エンドデバイス間折返し通信にはアドレス発見の課題があるた め、その解消のためにDDS(Data Distribution Service)を導 入 • Elixir/Nerves + CycloneDDSの実装を作成した • Node.connect通信と独立した関係になってしまっている • 今後評価を進める • エンドデバイス、エッジ間通信の実現に向けた検討もすすめる 14
  14. 補足スライド • Elixir, Nerves環境構築手順 16 vagrant@ubuntu-bionic:~$ sudo apt install build-essential

    automake autoconf git squashfs-tools ssh-askpass pkg- config curl vagrant@ubuntu-bionic:~$ sudo apt install libssl-dev libncurses5-dev bc m4 unzip cmake python vagrant@ubuntu-bionic:~$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.8.0 vagrant@ubuntu-bionic:~$ echo -e '¥n. $HOME/.asdf/asdf.sh' >> ~/.bashrc vagrant@ubuntu-bionic:~$ echo -e '¥n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc vagrant@ubuntu-bionic:~$ source ~/.bashrc vagrant@ubuntu-bionic:~$ asdf plugin-add erlang vagrant@ubuntu-bionic:~$ asdf plugin-add elixir vagrant@ubuntu-bionic:~$ asdf install erlang 24.1.5 vagrant@ubuntu-bionic:~$ asdf install elixir 1.12.3-otp-24 vagrant@ubuntu-bionic:~$ asdf global erlang 24.1.5 vagrant@ubuntu-bionic:~$ asdf global elixir 1.12.3-otp-24 vagrant@ubuntu-bionic:~$ mix local.hex vagrant@ubuntu-bionic:~$ mix local.rebar vagrant@ubuntu-bionic:~$ mix archive.install hex nerves_bootstrap