Skip to main content
BlockX 以 EC2 + systemd + ASG 的形态运行:Worker 由 systemd 托管一个前台 nerdctl run 容器,容器内的 broker 再通过宿主机 containerd 拉起 executor sandbox。生产上有两套互相隔离的集群(blockbundle,各自一对 coordinator + worker fleet),另有一支与之平行、不经过 coordinator 的 sync-invoker fleet。本页面向开发者,帮你建立”代码跑在哪、怎么被拉起来”的心智模型;完整的运维细节在 blockx 仓库 docs/deploy.mddocs/deploy/ 两套集群的隔离只来自 etcd registry prefix:block coordinator 只 watch /blockx/workers/,bundle coordinator 只 watch bundle 前缀,请求字段与 gRPC 协议不带任何”集群”标识。bundle 集群上线不代表流量已经切过去,上游路由方案另行设计。sync-invoker 不注册到 etcd,也不经过 coordinator,一次 Invoke 就是一次同步函数调用(详见 Sync Invoker)。

进程与二进制

Dockerfile 会构建下表五个二进制,都放在同一个镜像里,由启动命令选择入口。四个 coordinator/worker 入口都是”薄 profile”:cmd/*/main.go 只声明 app.Profile,公共装配、配置加载和关闭顺序在 internal/coordinator/appinternal/worker/app
表中端口是 internal/coordinator/app/config.gointernal/worker/app/config.gocmd/syncinvoker/config.go 里的默认值。EC2 systemd 模板会覆盖它们:worker 与 sync-invoker 都用 gRPC 0.0.0.0:9900、metrics 0.0.0.0:9901(见 deploy/env/*.env.example)。metrics HTTP 端点只在设置了 BLOCKX_PROMETHEUS_LISTEN_ADDR 时启动,路径由 BLOCKX_PROMETHEUS_PATH 决定,默认 /metrics
worker 与 bundle worker 的区别只在 app.ProfileDeploymentServiceWorkerRegistryPrefixBuildersPluginsTuneDefaults。EC2 上通过 worker.env 里的 WORKER_BINARYblockx-workerblockx-bundle-worker)选入口,deploy/scripts/blockx-worker-start 只接受这两个值。

依赖服务

BundleWrite 与 TableUpserts 的数据上传走 BlockDB 返回的 presigned URL 直接 PUT,不使用 worker 的 AWS credential chain,也不需要目标 bucket 写权限。IAM 与地址清单见 blockx 仓库 docs/deploy.md §2、§3.3。

配置发布方式

应用配置与云资源分属两个仓库:
  • blockx 仓只维护运行时产物:systemd unit、host 脚本、env 示例、health gate 与 runbook,全部在 deploy/
  • Chaintable/blockx-ec2-manifest 维护 worker.env(以及后续的 syncinvoker.env);合入 main 后按 Git SHA 上传为不可变 S3 对象,SSM 只保存 s3-v1 三行 pointer(BLOCKX_WORKER_ENV_FORMAT / BLOCKX_WORKER_ENV_S3_URI / BLOCKX_WORKER_ENV_SHA256),再触发 State Manager association。
  • DeBankDeFi/SRE(Terraform) 维护 ASG、launch template、User Data、IAM、SG、NLB、Prometheus scrape 与 deploy bundle URI。blockx 侧不直接改 AWS 资源。
实例上的收敛路径:User Data 下载固定版本的 deploy bundle 到 /opt/blockx-deploy,调用 blockx-worker-install;之后 State Manager 周期性跑 blockx-worker-reconcile,env 无变化则 skip,有变化则委托 install 重装、重启并跑 health gate。校验失败 fail closed,不覆盖本机 /etc/blockx/worker.env deploy/ 各目录:
改了 deploy/scripts/*deploy/systemd/* 之后要重新打 deploy bundle,并由 SRE 更新 bundle URI;reconcile 只收敛 env,不会把新脚本同步到已存在的实例。

镜像与 CI

Dockerfile 是两阶段构建:
  1. go-buildergolang:1.26-bookworm):编译 blockx-coordinatorblockx-bundle-coordinatorblockx-syncinvokerCGO_ENABLED=0)与 blockx-workerblockx-bundle-workerCGO_ENABLED=1,DuckDB 需要 cgo),目标 linux/amd64
  2. runtimepython:3.12-slim):pip install /app/python 装入 blockx_executor / blockx_sdk / blockx_audit 与私有依赖(blockdb-pyblockx-py 等),顺带装 py-spy;再把五个 Go 二进制复制到 /usr/local/bin。没有单独的 venv,Python 包直接装进镜像的系统 site-packages,PYTHONPATH=/app/python
私有 Go 模块与 Python 包的 GitHub token 通过 BuildKit secret(--secret id=github_token)注入,不进镜像层。 .github/workflows/ 发一个镜像就是打 tag 并推送(git tag v1.2.3 && git push origin v1.2.3)。EC2 侧只引用固定 tag 或 digest,不拉 latest

优雅停机

进程都处理 SIGTERM / SIGINT。coordinator 收到信号后 cancel() 根 context 并 GracefulStop() gRPC server。worker 的关闭在 internal/worker/app/app.go 里分两阶段:先 SetDraining 并从 etcd Deregister,等待在飞 task 完成(DRAIN_TIMEOUT_MS,代码默认 30s,EC2 模板 90s);再 cancel()、停 executor 池、关 IO scope、关闭 WatchTasks 订阅,最后 GracefulStop(5s 内不结束则 Stop)。ASG scale-in 不接 lifecycle hook,靠 worker 内建 drain + systemd ExecStop + etcd lease TTL 三层兜底。细节见 Worker

可观测性入口

指标定义与看板解读见 可观测性

相关文档

blockx 仓库:
  • docs/deploy.md — SRE 视角的部署总览、环境变量完整表、镜像地址。
  • docs/deploy/ec2-automation-plan.md — blockx / blockx-ec2-manifest / SRE 三方职责边界与发布路径。
  • docs/deploy/worker-systemd-nerdctl.md — worker EC2 runbook(安装、env、验收、回滚)。
  • docs/deploy/syncinvoker-systemd-nerdctl.md — sync-invoker EC2 runbook。
  • docs/deploy/sync-invoker-sandbox-host.md — sync-invoker host containerd sandbox 形态的验证记录。
  • docs/deploy/sync-invoker-loadtest-2026-06-29.md — sync-invoker 容量压测记录。
  • docs/sync-invoker-grafana.md — sync-invoker Grafana 看板指标口径。
  • docs/specs/2026-07-21-block-bundle-clusters.md — block / bundle 双集群拆分设计。
  • docs/specs/2026-07-28-registry-prefix-migration.md — registry prefix v2 与 COORDINATOR_REGISTRY_PREFIXES
  • docs/specs/2026-07-30-ec2-worker-profiling.md — EC2 worker 无宿主机依赖的性能采样方案。
站内:

本地开发环境

本地构建与跑起来的最小步骤。

可观测性

日志、指标、tracing 与 usage 的代码位置。

Worker

Worker 的装配、drain 与关闭顺序。

Bundle 集群

bundle coordinator / worker 与 bundle 专属能力。