跳到主要内容

后台任务队列 (Task Queue)

SayClaw Admin 内置后台任务队列,统一管理对单台或多台服务器的异步操作。所有后台任务均持久化于 admin_tasks 表,可追溯、可重试。

架构

HTTP 请求 / 业务操作

enqueueTask()

admin_tasks(MySQL)

taskWorker goroutine(每3秒轮询)

execOnServer()(本地 or SSH)

任务结果写回 admin_tasks

数据库表

CREATE TABLE admin_tasks (
id VARCHAR(36) PRIMARY KEY,
type VARCHAR(64) NOT NULL,
server_id VARCHAR(36),
payload JSON,
status ENUM('pending','running','done','failed') DEFAULT 'pending',
result TEXT,
error TEXT,
created_at DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
INDEX idx_status (status),
INDEX idx_server (server_id)
);

任务类型

type说明
exec_command在指定 server 上执行 shell 命令
restart_service重启 systemd 服务
deploy_config写入配置文件
health_check检查实例 gateway 状态

多服务器路由

  • server_id == ""server_id == LOCAL_SERVER_ID → 本地执行
  • 否则 → SSH 到目标 server(使用 /root/.ssh/id_ed25519
func execOnServer(serverID, command string) (string, error) {
if serverID == "" || serverID == os.Getenv("LOCAL_SERVER_ID") {
return execLocal(command)
}
return execSSH(serverID, command)
}

API

方法路径说明
POST/api/v1/admin/tasks入队新任务
GET/api/v1/admin/tasks/:id查询任务状态
GET/api/v1/admin/tasks?status=pending列出任务

术语统一补充(2026-03-05)

  • 若历史实现存在 admin_tasks,建议在迁移期提供兼容层,最终收敛到 task_queue
  • 任务状态字段与重试策略应与 Scheduler 文档保持一致。