4个版本 (2个破坏性更新)

0.3.0 2020年10月28日
0.2.0 2020年9月28日
0.1.1 2020年9月9日
0.1.0 2020年9月7日

#4 in #gwasm


用于 gfaas

LGPL-3.0

17KB
339

gfaas

在gWasm平台之上,使用函数即服务(FaaS)的Golem网络。

Build status Documentation Status

文档(master)

此crate允许您将重负载函数分布式到Golem网络(或未来添加对其支持时的任何其他兼容后端)。

快速开始

使用方法非常直接。在您的Cargo.toml中,将gfaas作为依赖项添加

# Cargo.toml
[dependencies]
gfaas = "0.3"

现在,您可以注释一些重负载函数,使其在Golem网络上分发,如下所示

use gfaas::remote_fn;

#[remote_fn]
fn hello(input: String) -> String {
    // let's make the input all-caps
    input.to_uppercase().to_string()
}

#[actix_rt::main]
async fn main() {
    let input = "hey there gfaas";
    let output = hello("hey there gfaas".to_string()).await.unwrap();
    assert_eq!(input.to_uppercase(), output)
}

为了编译您的代码,您需要在cargo上使用我们的自定义包装器gfaas。您可以使用cargo-install安装此工具,如下所示

cargo install gfaas-cli

然后,您可以使用gfaas就像使用cargo一样。因此,要在Golem网络上构建和运行,您将执行

gfaas run

关于gfaas::remote_fn的说明

当您使用gfaas::remote_fn属性注释一个函数时,它会被扩展为一个完整的异步函数,该函数可能失败。例如,以下函数

use gfaas::remote_fn;

#[remote_fn]
fn hello(input: String) -> String;

扩展为

async fn hello(input: String) -> Result<String, gfaas::Error>;

因此,重要的是要记住,您需要在异步块中运行该函数,并且为了获取您函数的结果,您需要从外层的Result类型中解包它。

异步性和Result存在是由于在节点网络上运行任何分布式计算的固有性质:它可能由于与您的应用程序无关的原因而失败,例如网络中断等。

此外,您的函数的输入和输出参数必须是可序列化的,因此它们应派生自serde::Serializeserde::Deserialize特性。

指定Golem的配置参数

您目前可以通过 gfaas::remote_fn 属性直接设置以下配置参数

  • NGNT 中的(最大)预算(默认为 100)
#[remote_fn(budget = 100)]
fn hello(input: String) -> String;
  • 秒数超时(默认为 10 分钟)
#[remote_fn(timeout = 600)]
fn hello(input: String) -> String;
  • 子网标签(默认为 "devnet-alpha.2")
#[remote_fn(subnet = "devnet-alpha.2")]
fn hello(input: String) -> String;

当然,没有人阻止您一次设置任意数量的参数

#[remote_fn(budget = 10, subnet = "my_subnet")]
fn hello(input: String) -> String;

关于 gfaas 构建工具以及为您的函数添加依赖的说明

需要自定义包装 cargo 的原因是因为带有 gfaas::remote_fn 注解的函数实际上在底层被自动交叉编译成一个 WASI 二进制文件。

此外,由于函数被交叉编译到 WASI,您需要在您的 Rust 工具链中安装 wasm32-wasi 目标。另外,由于相同的原因,并非所有 crate 都与 WASI 兼容,但您可以通过在您的 Cargo.toml 中添加 [gfaas_dependencies] 部分来手动指定您希望函数依赖的 crate。

# Cargo.toml
[package]
author = "Jakub Konka"

[dependecies]
actix = "1"

[gfaas_dependencies]
log = "0.4"

关于在本地运行您的应用程序(用于测试)的说明

众所周知,在将我们的应用程序部署到某些分布式节点网络之前,首先在本地测试应用程序以寻找错误和错误是很方便的。使用 gfaas 也是这样。为了强制您的应用程序在本地运行,只需将 run_local=true 作为参数传递给 gfaas::remote_fn 属性即可

#[remote_fn(run_local = true)]
fn hello(input: String) -> String;

这将在您的机器上为您的所有注解函数启动单独的线程,因此您可以在启动 Golem 网络上的任务之前验证一切是否按预期工作。

示例

有关如何使用此 crate 的几个示例可以在 examples/ 目录中找到。所有示例都需要构建 gfaas 构建工具。

依赖关系

~1.5MB
~35K SLoC