尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

River 任务控制实操手册:取消、暂停、小憩,一次讲透

River 任务控制实操手册:取消、暂停、小憩,一次讲透 River 任务控制实操手册取消、暂停、小憩一次讲透【免费下载链接】riverFast and reliable background jobs in Go项目地址: https://gitcode.com/gh_mirrors/river/riverRiver 是 Go 语言里做后台作业background jobs的框架。任务一旦入队你想停掉它、推迟它或者把整条队列按暂停键River 任务控制就三件套取消、暂停、小憩各管一类场景这篇一次讲透。3 分钟上手从客户端取消一个任务 最常用的控制动作是取消五步走完拿到你正在用的Client实例就是平时用来插入、查询作业的那个。确认目标作业的 ID通常存在业务表或作业表里。调用riverClient.JobCancel(ctx, jobID)实现见 client.go。还在队列里的作业可执行、已排期、待重试三种状态会被直接标记为已取消永远不会再被执行。如果作业正在运行River 不会硬杀它而是通知执行它的客户端取消该作业的 contextworker 需要自己感知并及时返回。三种控制手段一张表看懂 控制手段触发入口影响范围状态变化适用场景JobCancel任意客户端调用单个作业队列中的作业立即取消运行中作业被取消 context出错后不再重试用户撤单、数据过期JobCancel在 worker 的 Work 方法里返回当前作业返回即取消剩余尝试次数作废执行到一半发现任务已无意义JobSnooze在 worker 的 Work 方法里返回当前作业指定时长后重新可执行尝试次数不累加等外部服务恢复、自定义退避QueuePause/QueueResume客户端调用见 client.go整条队列队列中的作业不被领取恢复后按序处理维护窗口、下游 API 限流三个细节值得展开。JobCancel有两套入口客户端按 ID 取消适合事后再反悔worker 内部返回适合执行时自己发现该停了说明见 error.go。JobSnooze传 0 表示立即重新可执行典型用法是客户端优雅停机时把没跑完的作业无缝交给下次启动。QueuePause只作用于领取环节不碰任何数据。场景走查用户取消订单后台作业怎么办 电商场景用户下单后入队三个作业——锁定库存、发确认邮件、生成账单。30 秒后用户点了取消。遇到问题三个作业可能还在排队也可能已经在跑。放任不管会给已取消的订单发确认邮件库存也白锁了。怎么做决策业务侧对三个作业依次调用JobCancel。还在排队的那两个瞬间变成已取消没有任何副作用。正在跑的邮件作业收到取消通知context 被取消worker 检查到ctx.Err()非空后提前返回River 把这个作业标记为取消且不再重试。库存作业如果在通知到达前就跑完了则按成功正常收尾——这时需要业务再补一个冲正作业控制机制不替你回滚数据。最终效果数据库状态、外发邮件、库存变化三者一致没有僵尸任务。再配上Subscribe订阅EventKindJobCancelled事件前端提示和告警就都能自动触发。避坑清单 ⚠️别把取消当强杀Go 无法中断 goroutineworker 必须主动响应 context 并尽快返回否则作业还会跑完。JobSnooze不累加尝试次数外部依赖一直不恢复就会被无限小憩记得给退避设上限或兜底成普通重试。QueuePause不是批量删除作业会积压恢复前先评估积压量和下游吞吐。取消要和业务数据修改保持原子性时用事务版JobCancelTx回滚时取消一并撤销。下一步如果你的服务已经在用 River先把每条队列和每个作业类型对应的业务对象理清楚三种控制手段才能真正落到点上。这篇手册对两类人最有用要写取消按钮的接口同学和负责后台作业稳定性的同学。【免费下载链接】riverFast and reliable background jobs in Go项目地址: https://gitcode.com/gh_mirrors/river/river创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表