Skip to main content
BlockX 是一个函数执行层。它不存数据,也不编排作业:BlockDB 负责表的存取与订阅,Client 负责生成 task、编排 DAG 和触发;BlockX 只做中间那一段计算。它收到一个 task,把触发数据展开成一组互不依赖的函数调用,在 Worker 本机的 Python Executor 进程池里并行跑完,再把所有返回值一次性交给 Writer Plugin 落库或回传。 核心计算模式是 onchain table -> onchain table 的单行状态计算:源表一个区块里的每一行,各自经过一次轻量函数,得到目标表的一行。

函数执行层

BlockX 在整条数据链路里只承担”算”这一环:
  • 上游:BlockDB 的 block 表、普通表,或 S3 上按 bundle 切分的 parquet 分区提供输入行;Client(notebook、blockx-py 的 Pipeline、调度系统)决定什么时候、对哪个区块算什么。
  • BlockX:接收 task,扫描或接收触发数据,把每一行变成一次函数调用,在 Executor 池里并行执行,汇聚返回值。
  • 下游:Writer Plugin 把汇聚结果写回 BlockDB 的 block 表或普通表,或原样返回给 Client。
用户写的函数只读不写。它可以通过 SDK 读 BlockDB、调链节点 RPC、调用其他函数,但所有写入都由 task 声明的 Writer Plugin 在函数执行完之后统一完成。

一个 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 listoutputs
  • 三类 Call Builder 决定输入从哪来,三类 Writer Plugin 决定结果去哪;用户函数本身只读。
  • 异步 task 与同步 Invoke 是两个入口;block 与 bundle 是两套按 profile 区分的集群。
继续阅读: