打包工作进程
使用受支持的运行时、固定依赖项以及服务管理器或容器。配置重启限制和专用服务用户。将私有服务商凭据保存在应用公开文件之外的受保护配置中。
在操作变得重要之前保存进度
为任务使用持久队列或数据库。分配唯一操作标识符,记录外部请求并核对不确定结果。重启不应发送第二封邮件、创建第二个订单或重复扣费。
添加有用的可观测性
监控任务完成情况、队列时长、错误率和成本,而不是只检查进程是否存在。保持日志足够小以便审查,并遮盖无需保留的令牌、提示和文档。
设定明确上限
限制模型支出、浏览器并发数、运行时间和重试次数。保留易于使用的暂停开关和针对重大操作的人工审查路径。一个更小、观测良好的工作进程比不受限制的进程更容易被信任。
使用监督程序和审慎的计划
Systemd 和 Docker 是让进程在终端断开后继续运行的常见方式。对于 systemd 服务,Type=exec 比简单的后台启动更直接地报告执行失败,Restart=on-failure 可按有界策略重启失败。计划任务应避免重叠运行。明确设置工作目录、服务用户和环境。 该示例假设 koala-agent 用户、虚拟环境、worker 模块和私有环境文件已存在;在安装单元之前请先调整它们。
- 使用专用服务账户
- 设置重启延迟和失败上限
- 在启动计划运行前检查上一次作业状态
[Unit]
Description=Example agent worker
After=network-online.target
[Service]
Type=exec
User=koala-agent
WorkingDirectory=/opt/koala-agent
EnvironmentFile=/etc/koala-agent.env
ExecStart=/opt/koala-agent/.venv/bin/python -m worker
Restart=on-failure
RestartSec=10
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target官方文档:Systemd 服务语义
设置每日预算和重复边界
为工作进程设置最大请求数、支出上限和执行超时。对影响外部世界的操作使用持久化的幂等记录。浏览器点击成功可能发生在进程收到响应之前;重试前请检查外部状态。Docker Compose 密钥挂载可以让密钥不进入镜像,但权限和消费方应用仍需审查。
官方文档:Docker Compose 密钥
为周期性任务设置明确的追赶策略
对持久队列工作进程使用长期运行的服务,对有界计划任务使用由定时器触发的一次性服务。使用 systemd 日历定时器时,Persistent=true 可以在停机后触发一次错过的激活;它不会重建整个业务积压。决定这种追赶是否可取。RandomizedDelaySec 可以分散启动时间,而应用层租约可防止两个副本处理同一计划工作。
- 记录预期时区,并在启用计划前检查下次运行时间。
- 让任务的执行截止时间短于不得重叠的间隔,或使用带过期和所有权的持久租约。
- 让任务从已存储状态中选择未完成的工作,而不是假定之前的每个定时器事件都已运行。
- 在使用最新手册中的指令前,请检查已安装的systemd版本。
# Read-only checks after creating your own matching units.
systemctl list-timers --all
systemctl status koala-agent.service
journalctl -u koala-agent.service --since today --no-pager官方文档:systemd:定时器调度
区分崩溃循环与停滞的工作进程
重启策略可以恢复失败的进程,但每隔几秒重复无效凭据或损坏的迁移会让故障更嘈杂。限制服务启动次数并对重复失败发出告警。运行中的进程也可能卡住:测量最旧任务的时长和最后完成操作的时长。用一次性任务测试 API 中断、磁盘已满和进程停止,然后验证持久状态能防止重复的外部操作。
- 在应用程序中设置提供商预算和请求超时,并在运行时上设置 CPU/内存边界。
- Docker容器并不会仅因为是容器就拥有有用的工作负载专用内存限制;请有意配置并测试限制。
- 将密钥存储在镜像和公共目录树之外,然后测试崩溃日志和诊断信息是否会将其隐去。
- 保留手动停止途径,并要求对支出、生产写入或外部消息进行适当审查。
官方文档:systemd:服务监管 · Docker:容器资源约束