数据结构——如何确定没有正在运行的作业或使用者进程退出



在我们的业务场景中,我们有一个作业队列、一个生产者流程和几个消费者流程。只有当所有消费者都没有作业在运行时,生产者才会将新作业放入队列。消费者可能会死亡或卡住。如果该消费者不再工作,生产者应该认为这个死亡的消费者已经完成了它的工作。

我们使用redis服务器作为我们的作业队列。如何设计redis数据结构,使这一过程高效?

没有人回答我的问题,但我自己想出了一个解决办法。

步骤1

。在生产者开始将作业放入队列之前,我设置了一个标志键:SET dispatch.finished 0

步骤2

。在生产者将所有作业放入队列后,更改标志:SET dispatch.finished 1

步骤3

。保留一组worker id: "SADD workers ID1 ID2"

步骤4

。当工作线程取到要执行的任务时,设置一个标志:SET worker.ID1.busy 1,并在此标志上添加一个"过期"标志:EXPIRE worker.ID1.busy 3

第5步

。当工作线程发现队列中没有作业,并且dispatch.finished == 1时,则更新其繁忙标志:SET worker.ID1.busy 0

步骤6 。下一圈,生产者需要检查所有工人的忙碌标志是否为零(或不存在),并且作业队列为空,然后继续步骤1

最新更新