2个不稳定版本

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

#418科学

Download history 46/week @ 2024-03-09 2/week @ 2024-03-16 29/week @ 2024-03-30 8/week @ 2024-04-06 2/week @ 2024-04-13 1/week @ 2024-04-20 8/week @ 2024-05-11 2/week @ 2024-05-18 19/week @ 2024-06-08 39/week @ 2024-06-15 13/week @ 2024-06-22

71 每月下载量

MIT 许可证

43KB
1K SLoC

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

依赖项

~5.5MB
~95K SLoC