#workflow #deterministic #component #wasi #engine #sqlite #model

app obeli-sk

确定性的工作流引擎

16 个版本

新版本 0.2.2 2024年8月24日
0.2.1 2024年8月11日
0.1.15 2024年8月10日
0.1.10 2024年7月23日
0.1.7 2024年6月13日

#199数据库接口

Download history 566/week @ 2024-06-10 22/week @ 2024-07-08 123/week @ 2024-07-22 4/week @ 2024-07-29 657/week @ 2024-08-05 167/week @ 2024-08-12

951 每月下载量

AGPL-3.0-only

625KB
14K SLoC

方尖碑

基于WASI组件模型的确定性工作流引擎

项目状态 / 免责声明

这是一个 预发布版

此仓库包含本地开发和测试的后端代码。该软件不保证CLI或数据库格式的向后兼容性。如果尝试用于生产,请谨慎行事。

支持的平台

  • Linux x64

核心原则

  • 首先使用模式,使用 WIT 作为工作流和活动之间的接口。
  • 后端开发者的乐趣
    • 使用单个进程运行执行器、工作流和活动,并计划为外部活动提供逃生门。
    • 错误、超时时的自动重试,服务器崩溃后工作流执行继续。
    • 可观察性(计划中) - 参数和结果以及函数层次结构必须保留。
    • 可组合性 - 嵌套工作流,调用任何支持语言编写的活动
    • 重放和分支现有工作流(计划中)。修复问题并继续。
    • 工作流的时间旅行调试器(计划中)

概念和功能

  • 活动 必须是无状态的,以便在任何时候都可以停止和重试。此合同必须由活动本身履行。

    • WASI 活动在WASM沙盒中执行
      • 可以使用WASI 0.2 HTTP客户端连接到HTTP服务器。
      • 能够读写文件系统(计划中)。
    • 支持最大执行持续时间,超过该时间执行将暂停到间歇性超时。
    • 错误重试 - 在WASM陷阱(恐慌)或返回Error结果时。
    • 超时重试具有指数退避。
    • 执行结果持久化。
    • 性能选项以保持父工作流执行的活跃状态或卸载并重放事件历史记录。
  • 确定性工作流

    • 在WASM沙盒中运行
    • 与环境隔离
    • 能够生成子工作流或活动,可以是阻塞的,也可以最终等待结果
    • 每次状态改变时都会持久化执行,以便在中断或错误后重新播放。
    • 能够重新播放工作流,并添加日志消息和其他不改变执行确定性的更改(计划中)
  • HTTP触发器(计划中)

    • 作为URL路径挂载,处理HTTP流量。
    • 能够启动子工作流或活动。
  • 工作偷取执行器

    • 定期锁定一批当前挂起的执行,开始/继续它们的执行
    • 清理旧挂起的执行,这些执行已经过期的锁。有预算的执行将重试(计划中)。

安装

Docker

CONTAINER_ID=$(docker run -d getobelisk/obelisk)
docker logs --follow $CONTAINER_ID | grep "Serving gRPC requests"
docker exec $CONTAINER_ID obelisk client component list
# See Usage for more details

预构建的二进制文件

从GitHub发行页面下载最新版本

使用crates.io的最新版本

使用cargo-binstall下载

cargo binstall obeli-sk

或构建

cargo install --locked obeli-sk

Nix flakes

nix --extra-experimental-features nix-command --extra-experimental-features flakes run github:obeli-sk/obelisk

使用方法

启动服务器

obelisk server run

获取已加载函数的列表

obelisk client component list

wasm_workflow   fibo_workflow   wasm_workflow:sha256:885d60e8d9b09fadecae99d6143ec65ad819e1991275cba78e2431619381da75
Exports:
        testing:fibo-workflow/workflow.fiboa : func(n: u8, iterations: u32) -> u64
...

执行一个示例工作流

# Call fibonacci(10) activity from the workflow 500 times in series.
obelisk client execution submit testing:fibo-workflow/workflow.fiboa '[10, 500]' --follow

里程碑

里程碑1:发布二进制文件 - 完成

  • obelisk应用程序作为Linux二进制文件启动并运行
  • 工作流和wasm活动的调度,超时和失败时的重试
  • 使用sqlite进行持久化
  • 使用连接集并发启动子工作流/活动
  • 基本的CLI用于wasm组件配置和调度
  • GitHub发行版,Docker镜像,发布到crates.io,支持cargo-binstall

里程碑2:允许通过CLI和Web UI进行远程交互 - 开始

  • 将组件和一般配置移动到TOML文件中
  • 从OCI注册表中拉取组件
  • 将obelisk镜像发布到Docker Hub(ubuntu,alpine)
  • obelisk客户端组件推送
  • 执行管理gRPC API
  • 跟踪顶级父级
  • 执行管理的交互式CLI
  • 创建时参数类型检查,检查系统中所有函数的类型
  • 基于HTML的UI用于显示执行、事件历史和关系
  • 日志和跟踪配置,将事件发送到OTLP收集器

里程碑3

里程碑4

  • OpenAPI活动生成器
  • 插入挂起任务的限制或类似杀死最旧的挂起任务驱逐策略。
  • 多进程执行器
  • 标签限制工作流/活动到执行器
  • 定期调度
  • 截止日期传播
  • 取消传播
  • 队列容量设置,向执行提交添加背压
  • 重试预算,当活动失败一定百分比请求时禁用重试

从源码构建

使用nix flakes设置开发依赖关系

nix develop
# or `direnv allow`, after simlinking .envrc-example -> .envrc

或手动下载所有依赖项,请参阅dev-deps.txt基于Ubuntu的验证Dockerfile 运行程序

cargo run --release

运行测试

./scripts/test.sh

使用madsim模拟器进行确定性测试

./scripts/test-madsim.sh

贡献

此项目有一个路线图,并且功能以一定的顺序添加和测试。如果您想贡献一个功能,请在此GitHub存储库的问题中讨论该功能。为了我们能够接受补丁和其他贡献,您需要采用我们的贡献者许可协议(CLA)。CLA的当前版本可以在此处找到。

依赖项

~108MB
~2M SLoC