5

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

 2 years ago
source link: https://www.v2ex.com/t/783126
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  程序员

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

  tedd · 11 分钟前 · 24 次点击
一个发送消息的源头服务器,一个队列,两个 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?

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK