2个不稳定版本
0.2.0 | 2021年8月17日 |
---|---|
0.1.0 | 2021年8月16日 |
#418 在 科学
71 每月下载量
43KB
1K SLoC
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
依赖项
~5.5MB
~95K SLoC