2个不稳定版本

0.2.0 2021年8月17日
0.1.0 2021年8月16日

#603 in 科学

Download history 46/week @ 2024-03-12 7/week @ 2024-03-26 33/week @ 2024-04-02 3/week @ 2024-04-16 1/week @ 2024-04-23 4/week @ 2024-05-07 6/week @ 2024-05-14 33/week @ 2024-06-11 27/week @ 2024-06-18 9/week @ 2024-06-25

69 每月下载量

MIT 协议

45KB
925

DGE: 分布式图执行

这是什么?

概念上

  • 它提供构建计算图的构建块,并生成执行图的相应Rust代码

  • 图中的节点表示异构计算

  • 边表示节点之间的数据流

  • 计算图是静态的,意味着一旦定义就不能更改

  • 执行是分布式的,意味着节点可以运行在不同的机器上

具体来说

  • 您通过在.rs文件中定义crate dge-gen 来定义图,编译并运行它以生成代码(包括main.rs,依赖于dge-runtime),编译后可以用来执行图

  • 您将main.rs编译成可执行二进制文件,该二进制文件中的每个子命令对应于图中的一个节点。

  • 您负责使用适当的子命令启动二进制文件。(即DGE不处理二进制文件的部署和启动)

  • 您可以根据需要启动任意数量的相同子命令的实例,可能在不同机器上。

  • 每条边都由一个RabbitMQ队列支持,节点是该队列的消费者

  • 使用至少一次交付,这意味着您为节点编写的业务代码应该能够处理重复的消息

一个例子

以下图对应于计算 (2 * x) * (x * x)

它使用dge-example/src/main_generate_code.rs中的代码生成

use dge_gen;

fn main() {
    let mut graph = dge_gen::Graph::new(
        "dge_example::behaviour::accept_failure::accept_failure",
        "dge_example::behaviour::error::Error",
    );
    let start = graph.start("start");
    let fan_out = graph.fan_out(
        start,
        "input",
        "dge_example::behaviour::data::Integer",
        "duplicate_input",
        10
    );

    // ... some code omitted for brevity ...

    graph
        .generate(
            "dge-example/src/generated",
            "dge_example::behaviour::get_rmq_uri",
            "dge_example_work_exchange",
            "dge_example_retry_exchange",
            "retry_",
            "",
        )
        .unwrap()
}

当上述代码编译并运行时,将生成一个main.rs,当编译main.rs时,您将得到一个包含以下子命令的可执行文件

dge-example

USAGE:
    example <SUBCOMMAND>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

SUBCOMMANDS:
    double                       # when executed, it creates an OS process that doubles the input
    duplicate-input              # send x to node double and square
    init-exchanges-and-queues    # initialize necessary RabbitMQ entities
    multiply                     # creates a node that does multiplication
    square                       # creates a node that calculates the square

为上述图生成了这些源文件

dge-example/src/generated/
├── double.rs
├── duplicate_input.rs
├── graph.dot
├── graph.svg
├── init_exchanges_and_queues.rs
├── main.rs
├── multiply.rs
└── square.rs

依赖关系

~12–23MB
~342K SLoC