2个不稳定版本
0.2.0 | 2021年8月17日 |
---|---|
0.1.0 | 2021年8月16日 |
#603 in 科学
69 每月下载量
45KB
925 行
DGE: 分布式图执行
这是什么?
概念上
-
它提供构建计算图的构建块,并生成执行图的相应Rust代码
-
图中的节点表示异构计算
-
边表示节点之间的数据流
-
计算图是静态的,意味着一旦定义就不能更改
-
执行是分布式的,意味着节点可以运行在不同的机器上
具体来说
-
您通过在
.rs
文件中定义cratedge-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