onchain table -> onchain table 的单行状态计算:源表一个区块里的每一行,各自经过一次轻量函数,得到目标表的一行。
函数执行层
BlockX 在整条数据链路里只承担”算”这一环:- 上游:BlockDB 的 block 表、普通表,或 S3 上按 bundle 切分的 parquet 分区提供输入行;Client(notebook、blockx-py 的
Pipeline、调度系统)决定什么时候、对哪个区块算什么。 - BlockX:接收 task,扫描或接收触发数据,把每一行变成一次函数调用,在 Executor 池里并行执行,汇聚返回值。
- 下游:Writer Plugin 把汇聚结果写回 BlockDB 的 block 表或普通表,或原样返回给 Client。
一个 task 的三个阶段
三个阶段之间只传递扁平结果:Builder 不知道函数会返回什么,Writer Plugin 也不关心某一行来自哪个 call。详见 Task 与 Call。
三类输入与三类结果处理
task 用两个(type, config) 对声明”算什么”和”结果怎么处理”。type 是 Worker 注册表里的名字,config 是只有对应实现才解析的 JSON。
Call Builder 决定输入从哪来:
Writer Plugin 决定结果去哪:
每个 task 恰好一个 Call Builder、至多一个 Writer Plugin。详见 Call Builder 与 Writer Plugin。
两种调用入口
两者共用同一套 Python Executor、函数代码视图和只读 IO 子系统。Sync Invoker 不经过 Coordinator,也没有 slot 和 Writer Plugin。
两套集群
BlockX 用同一份代码、不同的进程 profile 部署成两套集群:
blockx-py 按 task 的 config 和 handler 自动选择集群;需要结果回传(
ReturnValueHandler)的 task 一律走 block 集群。详见 运行时。
小结
- BlockX 是函数执行层:不存数据、不编排,只把 task 展开成 call 并行算完再统一写回。
- 一个 task 经过 Builder → Calls → Plugin 三个阶段,阶段之间只传扁平的
call list和outputs。 - 三类 Call Builder 决定输入从哪来,三类 Writer Plugin 决定结果去哪;用户函数本身只读。
- 异步 task 与同步
Invoke是两个入口;block 与 bundle 是两套按 profile 区分的集群。
- Task 与 Call:task 的字段、状态、结果与不变量。
- 函数代码:入口约定、参数与返回值、可用的 SDK 与静态审计。
- Call Builder 与 Writer Plugin:三类输入与三类结果处理的配置形状。
- 运行时:Coordinator、Worker、slot、Executor 与两套集群。
- 架构总览:组件图、核心约束与贡献者阅读顺序。