【发布时间】:2015-04-09 11:17:56
【问题描述】:
场景(我已经简化了):
- 许多最终用户可以从前端 Web 应用程序(生产者)开始工作(繁重的工作,例如渲染大 PDF)。
- 作业被发送到单个持久 RabbitMQ 队列。
- 许多工作应用程序(消费者)处理这些作业并将结果写回数据存储区。
这种相当标准的模式运行良好。
问题:如果用户在同一分钟内启动了 10 个作业,并且在一天中的那个时间只有 10 个工作应用程序启动,那么这个最终用户实际上是在为自己接管所有计算时间.
问题:如何确保每个最终用户在任何时候都只处理一个作业? (奖励:不得限制某些最终用户(例如管理员))
另外,我不希望前端应用程序阻止最终用户启动并发作业。我只希望最终用户一次完成一项并发作业。
解决方案?:我应该为每个最终用户动态创建一个自动删除独占队列吗?如果是,我如何告诉工作应用程序开始使用此队列?如何确保一个(并且只有一个)工作人员会从这个队列中消费?
【问题讨论】:
-
一名工人排队。所以你可以计算类似:userid % workercount,添加路由,如rabbitmq.com/tutorials/tutorial-five-dotnet.html。因此,一次只能处理一个用户的一项任务。
-
我发现这种方法存在三个问题:1)工作人员的数量必须是相对静态的,该算法才能正常工作,2)生产者需要实时知道有多少消费者上线,3)如果某些用户开始的工作比其他用户多,那么工作量可能不会在工作人员之间公平分配。谢谢,但我希望有人能帮助我了解如何设置我的 RabbitMQ 队列和交换来实现这一点(完全有可能:))。
-
如果我对您的理解正确,您需要一些能够自动创建和终止工作人员并平均分配任务的东西。尝试添加调度程序节点或节点取决于您有多少任务。调度程序将为用户添加队列,当工作人员结束所有用户任务时,它会向调度程序发送消息以删除队列。一名工作人员可以处理多个用户队列,但在您的情况下,只有一名工作人员可以处理一名用户(管理员除外)。
-
使用redis或zookeeper控制正在处理的并发用户数
-
Robinho,是否愿意将您的评论扩展为答案?