fmq cd370d88e7 feat(all): 任务引擎双阶段解耦、僵尸涡旋修复、动态 CPU 配额与前端详情页重构
将 TLUSTY/SYNSPEC 拆为各自独立的 enabled/policy/strategies 阶段,
以策略链自动弹栈取代单级 seed_step 布尔回退;定向修复 2026-08-02
僵尸任务涡旋事故;新增节点并发配额热调;前端详情页从 1412 行巨型
视图拆为薄控制器 + detail 子模块,并补齐工具层与单测。

引擎与调度(task_engine_decoupling_design.md)
- models.rs: 新增 StagePolicy / EngineStageConfig / TaskSpec 阶段字段、
  normalize_compat() 校正旧版在途消息策略链、failed_stage 归因
- scheduler.rs: resolve_dispatchable_chain 派发门控、
  trigger_strategy_fallback 按 failed_stage 精确弹栈;启动期
  force_recompute/skip_converged(默认)/skip_failed 三策略
- db.rs: tasks 表 +7 列持久化阶段配置;终态守卫
  (mark_grid_point_running 仅 pending/queued→running;
  record_task_report 拒绝迟到失败翻黑 converged);策略弹栈快照

僵尸涡旋修复(runbook-20260802-zombie-vortex-fix.md)
- 全链路跨库活性交叉校验:派发/claim/孤儿回收/回退统一查 MQ 队列活性,
  活则放行、死则清僵尸,结构性消除"每点重复派发"
- stop/重启卫生:清队列同步 delete_tasks_by_ids,杜绝遗留 pending 行
- report_task: 幂等吸收 + 409 区分迟到冗余结果,仅 state_changed 时回退
- MQ: NULL workflow_name 回填 __legacy__、requeue 后迟到上报被 403 竞态修复

动态 CPU 配额(dynamic_cpu_slots_design.md)
- admin.rs: POST /admin/nodes/:id/quota(Option<Option<i32>> 区分
  缺字段/显式 null);nodes 表 +admin_max_slots
- worker.rs: effective_max_slots = min(admin, physical),心跳下发原子生效

科学产物保全(tlusty_result_artifacts.md)
- runner.rs: SYNSPEC 启动前快照 fort.12/fort.14 → .bfac/.emflux 防覆盖
- 半失败点(大气收敛+光谱失败)改判 Failed 并写入 note;仅 SYNSPEC
  场景不再恒判失败;撤销归档 LRU 200 上限改为永久保留
- executor.rs: 透传 synspec_params 数值参数(此前固定 None)

前端(dashboard/)
- workflowDetail.js 1412→328 行,拆出 views/detail/{ctx,overview,
  pointsTable,parSets,pointPanel}.js,AbortController 治理监听/请求生命周期
- 删除 wfActions.js,新增 wfEnginePanel.js(双阶段三维配置编辑面板)
- 新增 utils/{errors,format,icons,polling,yamlStage}.js 纯函数模块
- 路由级动态 import 代码分割;节点配额三点菜单 + Modal 管理
- 首次引入 node:test 单测(format/polling/yamlStage/psCache,644 行)
- 系统性补齐 a11y:skip-link、ARIA、Tab 键盘漫游、toast 关闭、退出动画

文档与工具
- 新增 6 篇设计/调研:引擎解耦、动态配额、涡旋 runbook、
  光谱正确性分析、收敛判断、产物归档
- PIPELINE/design/api/database 等协同重写为分布式 C/S 架构口径
- scripts/fetch_results.sh 跨节点产物备份;import_results 按 cno 升序导入
- workflows/sdB_cno.yaml: 新增 tlusty/synspec_stage 配置块,修正 wstart 笔误
2026-08-04 23:40:52 +08:00

DCTS (Distributed Computing TLUSTY/SYNSPEC)

基于 Rust 构建的高性能分布式恒星大气模型(TLUSTY)与合成光谱(SYNSPEC)网格计算调度系统。


💡 项目简介

DCTS 是专为恒星光谱计算设计的分布式计算控制系统。通过将多维度参数网格(如 Teff, log g, log He, log C, log N, log O)离散化为独立计算点,DCTS 能够在 Master 服务端统一管理任务队列与计算状态,由分布在不同物理节点上的 Worker 离散执行 4 阶段物理收敛链,实现自动化调度、种子传递、发散回退与高吞吐并行计算。


🚀 快速开始 (Quickstart)

1. 编译系统

cd dcts
cargo build --release

编译产物位于 target/release/

  • server:调度与 API 主服务端
  • node:计算节点后台进程
  • import_results:历史计算结果导入工具(旧版单机网格结果 → 标记已完成 + 迁移产物树)

2. 构建前端与启动服务端 (Master & Web Dashboard)

首先编译前端全域实时网格可视图看班:

cd dashboard && npm install && npm run build && cd ..

运行后端处理与管理主程序 (Master):

./target/release/server --workflow config.yaml --port 8090

服务端启动后将通过分级自动绑定监听:

  • 开放调配 RESTful 接口 (/api/...): 为算力节点群与客户调控工具开放的高速接口池。
  • 实时监控分析空间: 指向 dashboard/dist,使用通用现代浏览器访问 http://127.0.0.1:8090/ 即可免额外网关无障碍视见计算态势全局状态台。

3. 启动计算节点 (Worker)

在 Worker 节点配置 .env 环境变量:

DCTS_NODE_ID=node-worker-01
DCTS_SERVER_URL=http://<MASTER_IP>:8090
DCTS_MAX_SLOTS=4

运行节点进程:

./target/release/node

节点会自动加载 .env,与服务端握手注册、下载缺失的基础原子数据与可执行程序,并开始循环 Claim 任务执行计算。


🔐 安全与鉴权 (Security & Auth)

DCTS 采用分层鉴权模型,公网部署务必按下表配置凭据。

鉴权主体

主体 环境变量 用途 持有方式
Admin DCTS_ADMIN_TOKEN Dashboard 登录、工作流 CRUD、起停计算、节点审批授权 人工,Dashboard 输入
Node (服务端审批后自动颁发) 心跳、领任务、上报、下载数据 节点本地 .node_token 文件(权限 600

兼容:旧变量 DCTS_AUTH_TOKEN 仍有效,自动回退用作 Admin 凭据(建议迁移到 DCTS_ADMIN_TOKEN)。

节点注册流程(免凭据申请 + 管理员审批)

  1. 节点启动时优先读取本地 runtime/.node_token;不存在则免凭据/api/node/register 提交注册申请,进入 pending_approval 待审批状态。
  2. 管理员在 Dashboard「节点管理」面板点击【同意接入】后,服务端颁发该节点专属 token(仅返回一次,DB 只存 SHA-256 hash)。
  3. 节点轮询 /api/node/check_status 取回专属 token 并持久化到 .node_token(权限 600)。
  4. 后续所有请求携带专属 token;服务端按 token 反查 node_id 鉴权。
  5. 重发/停用:通过 Dashboard「节点凭据管理」面板或下方管理 API 操作。

节点凭据管理 API(Admin 角色)

方法 路径 说明
GET /api/admin/nodes 列出全部节点及凭据状态(在线/token 有效/颁发时间)
POST /api/admin/nodes/:node_id/approve 同意待审批节点的接入申请并颁发 token
POST /api/admin/nodes/:node_id/reject 拒绝待审批节点的接入申请
POST /api/admin/nodes/:node_id/reissue 重新颁发 token,返回新明文(旧 token 立即失效)
POST /api/admin/nodes/:node_id/disable 停用节点(保持在线但不再分发任务,可恢复)
POST /api/admin/nodes/:node_id/enable 重新启用被停用的节点

所有端点要求 Admin tokenAuthorization: Bearer <DCTS_ADMIN_TOKEN>)。被攻陷节点持有的 node token 无权访问这些端点,因此重发/停用始终是管理员主动行为。

公网部署清单

# .env(服务端配置;计算节点无需任何凭据,免凭据申请后由管理员审批授权)
DCTS_ADMIN_TOKEN=<强随机值>

TLS/HTTPS:请在容器外部自行配置反向代理(如 Nginx / Caddy / 云负载均衡)终止 TLS, 再将流量转发到本服务的 8090 端口。本服务默认仅监听 HTTP。

默认安全策略

  • CORS:仅允许同源或本地 Originlocalhost / 127.0.0.1 / [::1])。
  • 请求体限制:普通 API 10MB,任务上报 256MB。
  • 安全响应头CSP / X-Content-Type-Options / X-Frame-Options / Referrer-Policy 默认开启。
  • 审计日志:所有写操作(POST/PUT/DELETE)记录 subject + method + path(不记请求体)。
  • 应急调试DCTS_AUTH_DISABLE=1 跳过全部鉴权(仅本地,切勿生产)。

🏛️ Workspace 核心模块

Crate / Tool 类型 职责说明 详细文档
common Library 提供底层配置解析、输入文件构造、收敛判定、子进程调用与种子匹配引擎 README
server Binary 基于 Axum 的中央 API 服务端,负责网格生成、节点心跳、任务调度与状态持久化 README
node Binary Worker 节点 Daemon 进程,负责任务抢占、自适应环境预热、计算链执行与产物汇报 README
mq Library 基于 SQLite 构建的高可靠事务型分布式任务队列引擎 README
dashboard Web UI 基于 Vite 与原生高交互前端语系创写的分层式恒星网格任务可观测可视化控表空间 说明详情
import_results Tool CLI 历史计算结果导入工具(旧版单机网格结果 → 标记已完成 + 迁移产物树) README

📚 详细文档导航 (docs/)

系统技术细节按以下主题组织:


📄 License & 联系方式

  • License: MIT / Apache-2.0
  • Maintainers: TLUSTY High-Performance Computing Workgroup
S
Description
Tlusty/Synspec分布式计算
Readme
9.9 MiB
Languages
Rust 73.3%
JavaScript 15.2%
Shell 4.8%
CSS 3.9%
Python 1.7%
Other 1.1%