如何优雅的停止正在处理队列消息的 worker 呢?

日期 : 2021-06-15 14:52:04作者 : 望京博格

一个发送消息的源头服务器,一个队列,两个 worker 。worker 从队列中拿消息进行处理,处理过程中可能会因为数据源出现了更新,因此 worker 需要停止当前的处理并退出。请问有什么设计模式可以应用的吗?技术栈是 Redis (queue)、worker 是 Node 写的。

我目前想到的一个很笨的方法是还是用将正在处理的任务状态存在 Redis 中,当 worker 开始的时候,将这个 taskId:state 键值对的 state 值改成 processing,如果发送消息的源头出现了数据更新,则源头服务器更新 Redis 中的任务状态为 cancel,worker 处理数据其实是个大 loop,所以每次 loop 的时候先检查任务的 state,如果发现是 cancel 了,那就退出 loop 即退出处理。

又或者用 Redis 的 pubsub ?源头服务推送 cancel 的消息,worker 作为 sub 监听,如果碰到 cancel 的通知,就 process.exit?

你可以弄两个队列,比如 v1 版本的源数据放入到 v1 队列,A worker 负责处理。如果源数据有更新,则把新版本的数据放入到 v2 队列,然后再另起一个 B worker 处理 v2 版本的队列。等 v1 的队列都处理完了,就 Kill 掉 A worker

标签 :