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