• 简体中文
  • 3.5 啊哈实验:删掉连线

    前面的内容都是"读"和"看"。这一节我们动手做一个实验——改一行 YAML,观察现象的变化。通过这个"啊哈"瞬间,你会真正理解"连线=数据在流动"。

    学习目标

    学完本节,你将能够:

    • 通过修改 dataflow.yml 改变数据流的行为
    • 用"连线断了"的现象反向理解"连线"的本质
    • 证明 DORA 数据流中"数据通过 YAML 定义的连线流动"

    实验准备

    1. 确保之前的数据流已停止(Ctrl+C 终止)。
    2. 进入 aviation/ 目录。
    3. 打开 dataflow.yml
    cd aviation
    cat dataflow.yml

    当前内容:

    nodes:
      - id: controller
        path: target/release/aviation-controller
        inputs:
          tick: dora/timer/millis/16
        outputs: [cmd]
    
      - id: aviation
        path: target/release/aviation-dora
        inputs:
          cmd: controller/cmd
        outputs: [pose]

    实验:删掉连线

    把 aviation 的 inputs 中的 cmd: controller/cmd 这一行删掉(或注释掉),改为:

    nodes:
      - id: controller
        path: target/release/aviation-controller
        inputs:
          tick: dora/timer/millis/16
        outputs: [cmd]
    
      - id: aviation
        path: target/release/aviation-dora
        inputs:
          # cmd: controller/cmd    ← 这行被注释了!
        outputs: [pose]

    保存文件。

    观察现象

    现在运行数据流:

    dora run dataflow.yml

    两个窗口仍然会弹出,但这次:无论你怎么按控制器上的按钮,小飞机都一动不动。

    终端中,你也看不到 aviation 节点收到 cmd 的日志了——它只会打印 Publishing pose: ...,但 pose 的值永远不变(飞机停在起点)。

    Ctrl+C 停止。

    恢复原状

    dataflow.yml 改回来,取消注释:

        inputs:
          cmd: controller/cmd

    保存后重新 dora run,小飞机复活了——又能动了!

    "啊哈"时刻

    这个实验告诉我们什么呢?

    dataflow.ymlcmd: controller/cmd 这一行,就是"连接 controller 和 aviation 的管道"。删掉它,管道就断了,数据不再流动,小飞机自然收不到指令。

    实验中你没有改任何代码,只是改了一行 YAML。这就是 DORA 的核心思想:数据流的拓扑结构由配置定义,和代码分离。

    小莫

    看到没有?仅仅把一行文字注释掉,整个系统的行为就变了——这就是"配置即代码"的威力。controller 节点明明还在运行、还在发数据,但因为"管道"断了,接收方就永远收不到。就像两个人在打电话,电话线拔了,喊得再大声也听不见。

    延伸思考

    如果反过来,删掉 controller 的 tick: dora/timer/millis/16 这一行呢?

        inputs:
          # tick: dora/timer/millis/16    ← 删了定时器

    试试看会发生什么。(提示:controller 还在运行,但不再被"闹钟"叫醒,所以不会发送指令,小飞机也不动。)

    动手练习

    练习:拆掉控制器,让 aviation 独立运行

    如果把 dataflow.yml 中的 controller 节点整个删掉(删掉 - id: controlleroutputs: [cmd] 这 7 行),只保留 aviation 节点,然后 dora run,会怎样?

    参考答案

    aviation 节点会启动,弹出一个窗口,但控制器的窗口不会出现。由于没有控制器发送 cmd,小飞机停在原地不动。但 aviation 节点不会报错——它只是安静地等待永远不会到来的 cmd

    这说明了 DORA 的一个重要特性:节点之间是解耦的,一个节点不存在不会导致另一个节点崩溃——它只是收不到数据而已。

    常见问题 FAQ

    注释不生效,小飞机还能动

    确认保存文件后再运行 dora run。如果改动后还在用之前启动的旧进程,请先 Ctrl+C 停止再重新启动。

    恢复后小飞机还是不动

    确认删除了注释符号(#),确保 YAML 格式正确。YAML 对缩进很敏感,inputs:cmd: 要对齐。

    小结

    • 注释掉 cmd: controller/cmd 一行 → "连线断了",小飞机不动。
    • 不改代码只改配置,就能改变数据流的行为——这是 DORA 数据流架构的核心特性。
    • 反过来也成立:没有定时器,controller 不会触发;没有 controller,aviation 只会空等。
    • 数据流不是靠代码硬编码,而是靠 YAML 配置定义。

    做完这个实验,你已经理解了 DORA 数据流的核心机制。下一章我们将开始自己写节点——从 Python 开始,亲手创建你的第一个 DORA 节点!