欢迎回到 dora
教程!我们探索了 Dataflow
、 节点
和 操作符
等构建块,它们如何通过事件流接收信息,以及如何高效地传输 数据消息/Arrow Data
。
我们还了解了 API 绑定
如何帮助您编写组件代码,以及 Dora CLI
如何成为您管理一切的主要工具。
当您使用 Dora CLI
运行类似 dora run
命令时,实际上是在告诉 dora
执行您的数据流。但是,CLI
程序本身并不是运行节点和管理所有复杂通信的程序。
这项工作落到了构成 dora
运行时的后台进程身上。
这些后台进程中最重要的一个,尤其是在单机上运行的 Dora Daemon
守护进程 就是它。
想象一下,你的计算机就像一个小型工厂车间 ,你的数据流描述了不同的工作站( 节点 )以及它们之间的传送带。你需要一个工头或经理来确保:
Dora Daemon
就像那个当地的领班,它是一个运行在机器上的后台服务,负责管理特定机器上的 dora
组件。
其主要职责是:
Dataflow YAML
启动分配给其机器的节点进程。Dora CLI
(在简单的本地设置中)或 Dora Coordinator
(在分布式设置中)获取命令。dora run
中的守护进程让我们考虑最简单的情况:使用 dora run yolo.yml
在单台机器上运行像我们的 yolo.yml
示例这样的数据流。
执行此命令时:
Dora CLI
程序启动。CLI
连接到您机器后台运行的 Dora
守护进程。(如果守护进程未运行,CLI
可能会自动启动它)。CLI
将 yolo.yml
数据流定义发送给守护进程。YAML
并发现 camera
、 object-detection
和 plot
节点都需要在本地运行(因为没有指定 _unstable_deploy: machine
字段)。path
指定的代码(可能在运行 build
步骤之后)。YAML
中定义的 inputs
和 outputs
(例如 image: camera/image
),守护进程会在刚刚启动的进程之间建立高性能通信通道。对于图像等大数据,它使用共享内存 ,分配发送方和接收方 Node
进程均可直接访问的内存块,从而避免昂贵的复制操作。Node
进程。camera
头节点发送输出 image
时,它会与守护进程通信(通过 API
绑定和内部通道)。守护进程会查看其内部映射(来自 YAML
),并确定该 image
输出应该发送到 object-detection
的 image
输入和 plot
的 image
输入。object-detection
和 plot
节点,告知其 image
输入端有新数据可用,并提供共享内存的详细信息。接收节点随后会直接从此共享内存块读取数据。dora run
终端中按下 Ctrl+C
时,CLI
会向守护进程发送一个 STOP
信号。守护进程随后会向其管理的每个正在运行的 Node
进程的事件流发送 STOP
事件,使它们能够正常关闭。以下是本地运行的简化序列图:
该图显示守护进程是其机器上运行的节点的控制和通信的中心点。
在更复杂的设置中,您的数据流跨越多台机器,您将在每台承载 dora
节点的机器上运行一个 Dora
守护进程 。此外,还会有一个 Dora 协调器
来管理这些机器上的整体数据流。
在这种情况下:
Dora CLI
(通常)与 Dora 协调器
( dora start yolo.yml --coordinator-addr ...
)对话。YAML
中的 _unstable_deploy: machine
字段确定哪些节点在哪台机器上运行。Zenoh
,如 README
中所述)进行通信,以确保数据在网络中路由。然而,守护进程的核心职责仍然是在其机器上本地管理 dora
环境。Dora Daemon
内部Dora Daemon
作为单个后台进程运行(您经常可以在系统的进程列表中看到它)。它主要用 Rust
编写,以提高性能和可靠性。
其内部运作的关键方面包括:
IPC
) 机制与其启动的 Node
进程进行通信。这些通道是在 Node
使用 API 绑定
连接到守护进程时建立的。Dora CLI
或 Dora Coordinator
的命令(例如,启动数据流、停止数据流、获取日志)。Node
进程的请求(例如,“我想发送数据”、“我正在订阅我的事件流”、“我已完成此 Drop Token”)。Node
进程已退出)。Zenoh
从另一台机器上的守护进程接收数据)。你可以在 dora-daemon
包中找到守护进程的主要逻辑,具体位置为 binaries/daemon/src/lib.rs
。此文件包含核心 Daemon
结构体及其 run_inner
方法,该方法实现了主事件循环,用于处理来自 CLI/Coordinator
、Node
进程和其他来源的事件。
守护进程与 Node
进程之间的通信由 DaemonRequest
(从 Node
到守护进程)和 DaemonReply / NodeEvent / NodeDropEvent
(从守护进程到 Node)等消息定义,您可以在 libraries/message/src/node_to_daemon.rs
和 libraries/message/src/daemon_to_node.rs
文件中看到这些消息。每种语言的 API
绑定都封装了这些消息和底层通信通道。
Dora Daemon
是 dora
运行时的关键组件。它充当机器上的本地管理器,负责启动和监控分配给它的 Node
进程,最重要的是,它基于 Dataflow YAML
建立和管理它们之间高效的本地通信通道(例如共享内存) 。它接收来自 Dora CLI
或 Dora Coordinator
的指令,并确保数据流量在其本地机器上正确流动。
现在我们了解了本地管理器(守护进程),让我们了解一下协调多个守护进程并管理跨不同机器的数据流的组件: Dora Coordinator 协调器
。