如何根据条件限制并发消息消耗

2024-03-12

场景(我已经简化了事情):

  • 许多最终用户可以从前端 Web 应用程序(生产者)开始工作(繁重的工作,例如渲染大型 PDF)。
  • 这些作业被发送到单个持久的 RabbitMQ 队列。
  • 许多工作应用程序(消费者)处理这些作业并将结果写回到数据存储中。

这个相当标准的模式运行良好。

问题:如果用户在同一分钟内启动 10 个作业,并且一天中的那个时间只有 10 个工作应用程序启动,则该最终用户实际上接管了自己的所有计算时间。

问题:如何确保在任何时候每个最终用户只处理一项作业? (Bonus:某些最终用户(例如管理员)不得受到限制)

另外,我不希望前端应用程序阻止最终用户启动并发作业。我只希望最终用户等待他们的并发作业一次完成一项。

解决方案?:我应该为每个最终用户动态创建一个自动删除独占队列吗?如果是,我如何告诉工作应用程序开始使用这个队列?如何确保一名(且仅一名)工作人员将从该队列中消费?


正如迪莫斯所说,你需要自己构建一些东西来实现这一点。这是一种替代实现,需要额外的队列和一些持久存储。

  • 除了现有的作业队列之外,还创建一个“可处理作业队列”。只有满足您的业务规则的作业才会添加到此队列中。
  • 为作业队列创建一个使用者(名为“Limiter”)。 Limiter还需要持久存储(例如Redis或关系数据库)来记录当前正在处理哪些作业。限制器从作业队列读取并写入可处理作业队列。
  • 当工作应用程序完成处理作业时,它会将“作业完成”事件添加到作业队列中。

    ------------     ------------     ----------- 
    | Producer | -> () job queue ) -> | Limiter | 
    ------------     ------------     ----------- 
                         ^                |                    
                         |                V                    
                         |     ------------------------       
                         |    () processable job queue )  
           job finished  |     ------------------------       
                         |                |
                         |                V
                         |     ------------------------
                         \-----| Job Processors (x10) |
                               ------------------------
    

限制器的逻辑如下:

  • When a job message is received, check the persistent storage to see if a job is already running for the current user:
    • 如果没有,则将存储中的作业记录为正在运行,并将作业消息添加到可处理作业队列中。
    • 如果现有作业正在运行,则将该作业在存储中记录为待处理作业。
    • 如果作业是针对管理员用户的,请始终将其添加到可处理作业队列中。
  • When a "job finished" message is received, remove that job from the "running jobs" list in the persistent storage. Then check the storage for a pending job for that user:
    • 如果找到作业,则将该作业的状态从待处理更改为正在运行,并将其添加到可处理作业队列中。
    • 否则,什么也不做。
  • 限制器进程一次只能运行一个实例。这可以通过仅启动限制器进程的单个实例或通过使用持久存储中的锁定机制来实现。

它相当重量级,但如果您需要查看发生了什么,您可以随时检查持久存储。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据条件限制并发消息消耗 的相关文章

随机推荐

  • 原始图像应使用哪种 MIME 类型?

    原始图像 https en wikipedia org wiki Raw image format由相机 扫描仪等生成 通常比 JPEG 图像提供更多的后处理灵活性 如果我从 Web 服务器提供此类文件 我应该使用哪种媒体类型 也称为 MI
  • 从 JTabbedPane 中删除蓝色

    这是我第一次使用 JTabbedPane 看起来默认的外观和感觉在选项卡上和组件本身周围显示蓝色边框 我怎样才能禁用该效果 好吧 有一种简单快速的方法可以通过将 LookAndFeel 设置为 SystemLookAndFeel 或任何其他
  • 如何指定使用 bitbake/yocto 构建哪个内核

    我正在努力使用 yocto daisy 生成新的 BSP 当我构建图像时 我收到以下警告 NOTE Resolving any missing task queue dependencies NOTE multiple providers
  • 如何在Android中使用Intent连接已知的WiFi?

    我有这样的事情 wifiNetworks ArrayList
  • 接口错误(0,'')

    我已经使用 Django 构建了一个网站 当我尝试执行查询时 我收到了这个恼人的错误 如果我重新启动 Apache 服务器 该错误将在短时间内消失 Traceback File usr local lib python2 7 site pa
  • Add-ADGroupMember 找不到具有标识的对象

    我正在编写一个 PowerShell 脚本来将大量用户导入到 AD 中 其中一项是根据用户的程序编号将用户添加到 AD 安全组 大多数情况下 这工作得很好 除非我拼写错误 或者其他简单的人为错误 但是 我们有 2 个安全组 每个人都必须添加
  • Prism WPF 动态区域

    假设我们有一个包含模块 A 和 B 的 Prism 7 应用程序 主窗口有一个选项卡控件和两个按钮 用于将模块 A 或 B 添加到选项卡控件 我为选项卡控制项创建了一个绑定 并实现了一个项模板 其中包括 Prism Region 其名称绑定
  • 为什么是$!运算符右结合?

    我刚刚学习 Haskell 我仍然不完全清楚何时以及如何强制进行严格评估 当我想要一个函数严格评估它的参数时 我发现自己在写 f x y z 这看起来很奇怪 不应该 是左关联的 这样我就可以写 f x y z 并让它做我想做的事 我是不是完
  • 如何在 AFNetworking 2.0+ 中使用 AFHTTPRequestOperationManager 使用 cookie?

    众所周知 AFHTTP会话管理器AFNetworking 2 0 支持cookie 但有可能吗AFHTTP请求操作管理器在 AFNetworking 2 0 中支持 cookie 是的 AFNetworking 使用基础 URL 加载系统
  • 在python中创建v7.3的.mat文件

    我需要在 python 或 matlab 中执行涉及 60000X70000 矩阵的乘法 我有 16GB RAM 能够轻松加载矩阵的每一行 这就是我所需要的 我可以在 python 中创建整个矩阵 但不能在 matlab 中创建 无论如何
  • TypeScript - 将子类转换为超类

    下面的问题有简单的解决办法吗 我想将对象 B 转换为对象 A 感谢您的解决方案 export interface A a string export interface B extends A b string const b B a te
  • 类型错误:当我尝试识别照片时,“元组”对象无法解释为整数

    我想测试训练好的模型 我使用keras和opencv 代码如下 创建参数解析器并传递它们 ap argparse ArgumentParser ap add argument i image required True help path
  • 从包含 100,000 个整数的列表中检索两个最高的项目

    如何从包含 100 000 个整数的列表中检索两个最高的项目 而不必先对整个列表进行排序 Use heapq nlargest http docs python org library heapq html heapq nlargest 如
  • 选择多个字段分组依据和总和

    我想用 linq 对象列表 进行查询 但我真的不知道该怎么做 我可以进行组和求和 但无法选择其余字段 例子 ID Value Name Category 1 5 Name1 Category1 1 7 Name1 Category1 2 1
  • Angular 2 ngOnInit 中的测试承诺

    我有一个 Angular 2 组件 我试图对其进行测试 但我遇到了麻烦 因为数据设置在ngOnInit函数 因此不能立即在单元测试中使用 用户视图 component ts import Component OnInit from angu
  • VBA Internet Explorer 自动化 - 下载文件时如何选择“打开”

    这是我在 stackoverflow 上遇到的第一个问题 我一直在寻找这个问题的解决方案一段时间 但没有找到任何帮助 我可能只是在搜索中使用了错误的关键字 但到目前为止我还没有运气 这是问题 在 VBA 中 如何从 Internet Exp
  • Mongoose findoneandupdate 返回更新的文档但未在数据库中更新

    架构是正确的 这些字段应该更新 因此 我从一次 API 调用中获取了部分数据 还有一些来自另一个 我将在下面注明 我的架构 var coin new Mongoose Schema id Number rank Number source
  • 带有多个提交按钮的表单的 Javascript onsubmit

    我有一个带有两个提交按钮的表单 一个称为 显示 另一个称为 取消注册 显示提交不需要确认 而其他则需要确认 本来我打算用 onsubmit return confirm Are you sure you want to remove the
  • 在matlab中求解矩阵方程

    我有一个类型的方程c Ax By where c x and y是维度为 50 000 X 1 的向量 并且A and B是维度为 50 000 X 50 000 的矩阵 Matlab有没有办法求矩阵A and B when c x and
  • 如何根据条件限制并发消息消耗

    场景 我已经简化了事情 许多最终用户可以从前端 Web 应用程序 生产者 开始工作 繁重的工作 例如渲染大型 PDF 这些作业被发送到单个持久的 RabbitMQ 队列 许多工作应用程序 消费者 处理这些作业并将结果写回到数据存储中 这个相