Skip to content

调度与执行编排模块

1. 模块目标

承载智能调度核心逻辑,负责在支持范围内做收益比较、生成切换决策、触发执行,并在异常时冻结调度。

2. 模块边界

对外提供

  • 调度范围管理
  • 调度策略引擎
  • 调度任务管理
  • 执行编排器
  • 冻结与恢复控制
  • 调度结果记录与通知

不负责

  • 直接管理矿机连接
  • 直接维护币种配置
  • 持有设备主状态

3. 核心对象

  • 智能调度任务
  • 调度范围
  • 调度候选币种
  • 冻结状态
  • 恢复状态
  • 调度结果

4. 核心流程

  1. 获取收益快照、异常状态与可调度币种范围
  2. 做收益比较并生成决策
  3. 调用设备控制服务执行切换或批量命令
  4. 记录执行结果
  5. 异常时冻结整个调度域,并通知用户

5. 智能调度读取边界

在智能调度场景中,本模块应建立在统一配置输入之上,而不是自行维护候选币种配置。

最小链路可理解为:

  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. 已知问题

  • 基准采样算力/功耗回填已接入:switchingsampling → 读 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_periodsprofit_guard tick 内逐机 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_tickssmart_schedule_machine_decisionssmart_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:补充智能调度资格范围与候选币种读取边界,明确配置模块只提供候选输入边界,调度模块负责在候选范围内结合收益和异常状态做决策与冻结判断