我是Celery / AMQP的新手,我正在尝试设计任务/队列/工人设计以满足以下要求。
我有多种类型的“每用户”任务:例如,TaskA,TaskB,TaskC。这些“每用户”任务中的每一个都为系统中的一个特定用户读/写数据。所以在任何给定的时间,我可能需要创建任务User1_TaskA,User1_TaskB,User1_TaskC,User2_TaskA,User2_TaskB等。我需要确保,对于每个用户,没有任何任务的两个任务类型并发执行。我想要一个系统,其中没有工作人员可以在执行User1_TaskB或User1_TaskC的同时执行User1_TaskA,但是当User1_TaskA正在执行时,不应阻止其他工作程序同时执行User2_TaskA,User3_TaskA等。
我意识到这可以使用某种外部锁定机制(例如,在DB中)实现,但我希望有一个更优雅的任务/队列/工作者设计可以工作。
我认为一种可能的解决方案是将队列实现为用户存储桶,这样,当工作人员启动时,配置会指定要创建的存储桶数量,并且每个“存储桶工作者”只绑定到一个存储桶。然后,“中间工作者”将从主任务队列中拉出任务,并通过例如散列/ mod方案将它们分配到分段队列中。因此,UserA的任务总是在同一个队列中,UserA的多个任务将相互支持。我不喜欢这种方法,因为它需要提前定义桶的数量,并且似乎阻止(轻松)动态添加工作者。在我看来,必须有一个更好的方式 - 建议将不胜感激。