Appearance
调度与执行编排模块
1. 模块目标
承载智能调度核心逻辑,负责在支持范围内做收益比较、生成切换决策、触发执行,并在异常时冻结调度。
2. 模块边界
对外提供
- 调度范围管理
- 调度策略引擎
- 调度任务管理
- 执行编排器
- 冻结与恢复控制
- 调度结果记录与通知
不负责
- 直接管理矿机连接
- 直接维护币种配置
- 持有设备主状态
3. 核心对象
- 智能调度任务
- 调度范围
- 调度候选币种
- 冻结状态
- 恢复状态
- 调度结果
4. 核心流程
- 获取收益快照、异常状态与可调度币种范围
- 做收益比较并生成决策
- 调用设备控制服务执行切换或批量命令
- 记录执行结果
- 异常时冻结整个调度域,并通知用户
5. 智能调度读取边界
在智能调度场景中,本模块应建立在统一配置输入之上,而不是自行维护候选币种配置。
最小链路可理解为:
- 数据与配置服务提供具备智能调度资格的币种范围
- 数据与配置服务提供候选币种的可运行配置和必要适配边界
- 收益数据与监控模块提供收益快照和异常状态
- 调度核心服务基于这些输入做收益比较、切换判断和冻结判断
- 调度核心服务调用设备控制服务执行调度动作
这里的关键边界是:
- 配置模块负责“能否进入候选范围”
- 调度模块负责“候选范围内如何判断和执行”
- 设备控制服务负责“如何执行”
6. 候选范围与调度判断的边界
6.1 本模块负责
- 读取具备智能调度资格的候选币种范围
- 结合收益与异常状态进行调度判断
- 生成最终调度结果
- 触发执行或冻结
6.2 本模块不负责
- 维护币种、钱包、矿池、启动参数的主配置
- 自行定义资格范围主事实
- 把“候选资格存在”直接等同于“本轮必须切换”
6.3 与配置模块的分工
可按以下方式理解:
- 配置模块给出候选边界
- 调度模块在候选边界内做实时决策
如果候选范围和调度判断不分离,后续会导致:
- 调度服务维护自己的配置副本
- 配置模块被误扩展成收益策略模块
- 冻结、收益比较和资格维护边界混乱
7. 对外能力
- 开启 / 停止智能调度
- 查看调度状态与冻结原因
- 生成调度决策
- 下发批量调度命令
- 记录调度结果与通知事件
7.1 Go Scheduler 物理实现
T0044 后,智能调度核心服务的物理实现方向收敛为 Go 服务:
apps/go-services/scheduler
该 Go 服务是云端服务,不运行在矿机上。它负责长期 tick、单机决策、基准采集编排、执行编排、冻结与用户可见日志。
Go scheduler 不改变原有逻辑边界:
- 不直接连接矿机 Agent
- 不维护币种、矿池、钱包、启动参数主事实
- 不替代设备控制服务执行命令
- 不让前端承担收益计算或调度决策
数据库结构设计见 docs/schema-patches/20260602-go-scheduler-smart-schedule.sql。
8. 依赖关系
- 强依赖收益数据与监控模块提供利润与异常状态
- 强依赖币种与挖矿配置模块提供可调度币种与运行参数
- 强依赖设备与 Agent 管理模块执行切换动作
- 被平台接入与控制台模块启停和查看结果
9. 约束
- 负责“该不该调度、调度到哪里、何时冻结”
- 智能调度是自动执行型,而不是建议型
- 冻结不改变机器当前运行币种、不停机
- 恢复由用户手动重新开启
- 不直接维护智能调度资格范围的主事实
- 不维护候选币种配置的主版本
10. 已知问题
- 基准采样算力/功耗回填已接入:
switching→sampling→ 读machine_mining_runtime+metric_powers→ 写smart_schedule_machine_project_benchmarks;采样窗口默认 300s,可配置benchmark_sample_window_sec - 生产环境须 shadow dry-run 后再开启 execute;勿与 PHP
smart_schedule_tick.php并行真实执行
11. 实时订阅
Go scheduler 提供 SSE 长连接:GET /api/v1/smart-schedule/stream?policy_id=<id>,用于控制台实时展示调度过程;详见 apps/go-services/scheduler/README.md。
12. 最近变更
- 2026-06-18:根据 T0075,Go scheduler 改读
cluster_tariffs/cluster_tariff_periods;profit_guardtick 内逐机machine → cluster → MatchCurrentPeriod计算DailyElectricityCostCNY;策略 readiness 按参与机器涉及集群检查电价缺口(tariff_gaps);废弃smart_schedule_policy_groups.tariff_id与独立 tariffs API - 2026-06-15:智能调度策略组新增
schedule_mode双模式:profit_guard(保低电费,收益+电价决策,时间窗不参与)与time_window(固定时间段,仅按时间窗开/停/挖,窗外保持现状);详见docs/superpowers/specs/2026-06-15-smart-schedule-dual-mode-design.md - 2026-06-04:Go scheduler 新增智能调度过程 SSE 实时订阅(
progress/log/tick事件,支持历史日志回填与after_id断线续传) - 2026-06-03:根据 T0034 / T0059–T0065,Go scheduler 已支持周期 tick(
serve+tick_interval_sec)、收益连续失败冻结、USDT_TO_CNY_RATE、shell job 状态日志、switch/stop/power_off execute、基准采样切币编排;详见apps/go-services/scheduler/README.md - 2026-06-03:根据 T0016,智能调度资格与候选读取边界已文档化:资格
smart_schedule_resource_eligibilities,候选smart_schedule_policy_candidates - 2026-06-03:根据 T0058,Go scheduler execute 已接入
switch执行器;配置BLSFLOW_SCHEDULER_SWITCH_API_BASE_URL后会调用现有批量切币 API 创建执行任务,并将返回的job_id写入smart_schedule_machine_decisions.action_job_id;未配置执行器时保守转为 skip,不抢锁、不伪造任务 - 2026-06-03:根据 T0057,Go scheduler 已提供受控 execute HTTP/CLI 入口,必须开启
BLSFLOW_SCHEDULER_EXECUTE_ENABLED才能触发;T0058 前该入口仅做到机器锁前置保护 - 2026-06-03:根据 T0056,Go scheduler runtime 已具备 execute 前置机器锁原子占用能力;需要真实动作的决策会先抢占
smart_schedule_machine_locks,抢锁失败保守转为 skip;尚未开放 execute 入口或调用设备控制服务 - 2026-06-03:根据 T0055,Go scheduler dry-run 已能为缺失、过期或无效的单机项目基准创建
smart_schedule_benchmark_runs(status=pending),并输出 benchmark 阶段日志与benchmark_required决策;仍不执行真实采样 - 2026-06-03:根据 T0054,Go scheduler dry-run 已支持写入
smart_schedule_ticks、smart_schedule_machine_decisions与smart_schedule_log_events,用于日志面板与审计;仍不会下发真实执行 - 2026-06-03:根据 T0053,Go scheduler dry-run 已支持时间段策略优先级与机器锁识别,时间窗动作覆盖收益决策,锁命中输出 skip
- 2026-06-03:根据 T0052,Go scheduler dry-run 已能读取当前运行币种并输出 keep/switch/负收益动作预览,尚未写库或执行
- 2026-06-03:根据 T0051,Go scheduler dry-run 已形成收益估算与净收益可用性输出,尚未读取当前运行币种或生成 keep/switch 决策
- 2026-06-02:根据 T0050,Go scheduler dry-run 已能输出单机候选项目收益输入明细与日电费成本输入,尚未调用收益 API 或生成决策
- 2026-06-02:根据 T0049,Go scheduler 已具备收益 API client,但 runtime tick 尚未调用收益 API 或生成单机决策
- 2026-06-02:根据 T0048,Go scheduler dry-run 已补齐当前电价匹配与基准 missing/expired/invalid 分类
- 2026-06-02:根据 T0047,Go scheduler dry-run 已补充电价时段与单机项目基准覆盖扫描,仍不进入收益 API、决策落库或真实执行
- 2026-06-02:根据 T0044 明确智能调度核心服务采用 Go 实现,物理路径为
apps/go-services/scheduler - 2026-04-03:根据系统骨架、服务边界与需求边界生成模块文档
- 2026-04-10:补充智能调度资格范围与候选币种读取边界,明确配置模块只提供候选输入边界,调度模块负责在候选范围内结合收益和异常状态做决策与冻结判断