情景(我简化了一些事情):
这个相当标准的模式运作良好。
问题:如果用户在同一分钟内启动了10个作业,并且当天只有10个工作程序应用程序启动,则此最终用户有效地接管了所有计算时间
问题:如何确保每个最终用户只能处理一个作业? (奖金:某些最终用户(例如管理员)不得受到限制)
另外,我不希望前端应用程序阻止最终用户启动并发作业。我只希望最终用户等待他们的并发作业一次完成一个。
解决方案?:我应该为每个最终用户动态创建一个自动删除独占队列吗?如果是,我如何告诉worker应用程序开始使用此队列?如何确保一个(并且只有一个)工作人员将从此队列中消费?
答案 0 :(得分:6)
正如Dimos所说,你需要自己构建一些东西来实现它。这是一个替代实现,需要额外的队列和一些持久存储。
当工作者应用程序完成处理作业时,它会添加一个"作业完成"事件到工作队列。
------------ ------------ -----------
| Producer | -> () job queue ) -> | Limiter |
------------ ------------ -----------
^ |
| V
| ------------------------
| () processable job queue )
job finished | ------------------------
| |
| V
| ------------------------
\-----| Job Processors (x10) |
------------------------
限制器的逻辑如下:
它是相当重量级的,但如果您需要查看正在进行的操作,您可以随时检查持久存储。
答案 1 :(得分:4)
RabbitMQ本身不提供这样的功能。 但是,您可以通过以下方式实现它。您将不得不使用轮询,这不是那么有效(与订阅/发布相比)。您还必须利用Zookeeper来协调不同的工作人员。
您将创建2个队列:1个高优先级队列(用于管理作业)和1个低优先级队列(用于普通用户作业)。 10名工作人员将从两个队列中检索消息。每个工作人员将执行一个无限循环(理想情况下,当队列为空时,具有休眠间隔),它将尝试互换地从每个队列中检索消息: