使用 RabbitMQ 的工作池和多租户队列

2023-12-25

我开发的 Web 应用程序是一个基于多租户云的应用程序(很多客户端,每个客户端都有自己独立的“环境”,但都在共享的硬件集上),我们正在引入用户批量处理的功能为后期处理工作。批处理工作的类型实际上并不重要,只是数量足够,没有工作队列就不太实际。我们选择 RabbitMQ 作为我们的底层队列框架。

因为我们是一个多租户应用程序,所以我们不一定希望客户端能够导致另一个客户端的队列处理时间过长,因此我们提出的一个想法是在每个客户端的基础上创建一个队列,并让一个共享工作池指向我们所有的客户端队列。问题是,据我所知,工作人员直接绑定到特定队列,而不是交换器。在我们的理想世界中,我们的客户端队列仍将在共享工作池中进行处理,而不会出现一个客户端阻塞另一个客户端的情况,我们可以根据需要通过启动更多工作线程或关闭空闲工作线程来扩大或缩小该工作线程池。从实际意义上讲,将工作人员绑定到特定队列可以防止我们这样做,因为我们经常有很多工作人员在队列中闲置而没有任何活动。

有没有一个相对直接的方法可以实现这一点?我对 RabbitMQ 相当陌生,还没有真正能够完成我们所追求的目标。我们也不想编写非常复杂的多线程消费者应用程序,这会浪费我们可能无法承受的开发和测试时间。如果确实如此,我们的堆栈是基于 Windows/.Net/C# 的,但我认为这不会对当前的问题产生重大影响。


您可以查看优先级队列实现(最初提出此问题时尚未实现):https://www.rabbitmq.com/priority.html https://www.rabbitmq.com/priority.html

如果这对您不起作用,您可以尝试其他一些技巧来实现您想要的效果(应该适用于旧版本的 RabbitMQ):

您可以将 100 个队列绑定到主题交换,并将路由键设置为用户 ID % 100 的哈希值,即每个任务将具有 1 到 100 之间的键,并且同一用户的任务将具有相同的键。每个队列都与 1 到 100 之间的唯一模式绑定。现在,您拥有一组工作人员,它们以随机队列号开始,然后在每个作业后递增该队列号,再次 % 100 在队列 100 后循环回到队列 1。

现在,您的工作人员队列可以并行处理最多 100 个唯一用户,或者如果没有其他工作要做,所有工作人员都可以专注于单个用户。如果工作人员需要在每个作业之间循环遍历所有 100 个队列,那么在只有单个用户在单个队列上有大量作业的情况下,每个作业之间自然会产生一些开销。减少队列数量是解决此问题的一种方法。您还可以让每个工作线程保持与每个队列的连接,并使用每个队列最多一条未确认的消息。如果未确认的消息超时设置得足够高,工作人员就可以更快地循环浏览内存中的待处理消息。

或者,您可以创建两个交换器,每个交换器都有一个绑定队列。所有工作都进入第一个交换器和队列,由工作池消耗。如果一个工作单元花费的时间太长,工作人员可以取消它并将其推送到第二个队列。当第一个队列上没有任何内容时,工作人员仅处理第二个队列。您可能还需要几个具有相反队列优先级的工作人员,以确保当有永无休止的短任务流到达时,长时间运行的任务仍然得到处理,以便最终始终处理用户批次。这不会真正将您的工作人员队列分布在所有任务中,但它会阻止一个用户的长时间运行任务,从而阻止您的工作人员为同一用户或另一个用户执行短期运行任务。它还假设您可以取消作业并稍后重新运行它,不会出现任何问题。这还意味着超时且需要以低优先级重新运行的任务将会浪费资源。除非你能提前识别快任务和慢任务

如果单个用户有 100 个缓慢任务,然后另一个用户发布一批任务,则第一个建议的 100 个队列也可能存在问题。在其中一项缓慢任务完成之前,不会查看这些任务。如果事实证明这是一个合理的问题,您可以将这两种解决方案结合起来。

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

使用 RabbitMQ 的工作池和多租户队列 的相关文章

随机推荐

  • 如何存储/加载大型 C++ 容器

    我想知道如何存储 C 容器以实现高效加载 例如如何存储非常大的整数向量 我知道我可以将它们保存在文件中 并从该数据中创建新的向量 include
  • IIS7,web.config 仅允许静态文件处理程序位于网站的 /uploads 目录中

    如果我认为可能的话 如何修改我的 web config 以使子目录静态 里面的文件将仅作为静态文件处理 即使其名称是 aspx 或其他名称 谢谢 将以下内容添加到web config文件位于包含您希望仅作为静态内容提供的文件的文件夹中
  • CMake 脚本的命名约定是什么?

    我知道 CMake 使用标准名称 CMakeLists txt 和add subdirectory用于在构建过程中直接调用脚本的函数 我有一些 CMake 代码 用于将文件转换为 C 字符串 然后可以使用这些代码将其烘焙到程序中 inclu
  • 如何在 MethodEntry 回调中获取参数值

    我有以下java代码 public class Test public void sayHello String msg System out println msg new Test sayHello Bonjour 我有一个附加到 ja
  • Git 传输协议规范

    我正在玩git 的传输协议 http git scm com book en Git Internals Transfer Protocols 我只是想知道在尝试阅读源代码之前是否有一些详细的规范 2018 年 5 月更新 从 2018 年
  • AWS Lambda 返回无法导入模块“main”:当模块存在时,没有名为“main”的模块

    因此 我尝试在 AWS Lambda 中设置一个函数来运行我从 zip 导入的一些 python 代码 I ve edited the handler to run the file then the function I want to
  • 正则表达式:仅匹配不重复出现的字符

    我需要查找并替换字符串中所有出现的撇号字符 但前提是该撇号后面没有另一个撇号 That is abc def 是一个匹配但是 abc def 不匹配 我已经编写了一个工作模式 但我相信它可能会更短 更简单 Thanks Valery 取决于
  • 如何在 Coding Ground 上安装 numpy 库?

    我尝试在Python的Coding Ground上安装neurolab termcolor库 使用进入工作文件夹 pip install target neurolab pip install target termcolor 他们都工作了
  • xpath获取整个xml树结构

    有没有办法使用xpath获取整个树结构 例如 假设这是 xml a b b a
  • Python:迷你字母表中所有可能的固定长度单词(排列)

    假设我有一个像这样的字符串 abcdefghijklmnopqrstuvwxyz1234567890 gt lt 这基本上是我键盘上所有字符的列表 比方说 我怎样才能获得由 8 个字符组成的 单词 的所有可能组合 我知道会有数百万种可能性
  • 在本地 xampp/apache 服务器上设置 SSL

    我正在尝试从本地网络服务器访问 Active Directory 为此 我使用最新版本的 xampp 和一个名为的 PHP 脚本adLDAP http adldap sourceforge net 如果我理解正确的话 我需要启用 SSL 来
  • beanWrapperImpl 仅与 websphere 相关

    我们开发中的 WAS 和我们本地的 WAS 之间存在差异 我们的应用程序使用 Spring Security 和 Spring 版本 3 1 0 release 它从 JSP 文件开始 我们试图显示连接的用户名 在 DEV 中的 WAS 上
  • Azure 服务总线队列 PeekBatch 锁定?

    我正在使用PeekBatch
  • ReactJS 中的非阻塞渲染

    我正在学习 ReactJS 并尝试在其上构建一些应用程序 当我尝试修改状态和渲染时 我的页面会冻结 并且在组件变得巨大时渲染完成之前无法执行任何操作 我发现我可以使用shouldComponentUpdate优化我的代码 但我的问题是 我可
  • 如何在 Chrome 中使用 Node 8 检查器?

    我熟悉使用 inspect从节点 7 或其他版本开始的选项 现在在节点 8 上 它不起作用 今天我像往常一样要求节点使用检查器 node inspect debug brk node modules mocha bin mocha o te
  • 有没有办法用Java代码获得一个只有数字(没有小数、空格)的Android软键盘?

    我有一个使用不同键盘布局的 iPhone 应用程序 有些是自定义的 有些是内置的 仅数字 小数点 ISBN 编号的自定义 X 按钮 我想在 Android 上做同样的事情 但即使是普通的InputType TYPE CLASS NUMBER
  • REST API 真的是 RESTful 吗?

    我是这个游戏的新手 所以我可能会误解一些事情 事实上 如果有人告诉我我误解了事情 那将是一种恩惠 也许这个人会足够体贴 为我指明正确的道路 但 中的一个 指导方针 or 最佳实践 REST 适用于 Web 服务 http en wikipe
  • 从静态工厂类访问 ASP.NET Core DI 容器

    我创建了一个 ASP NET Core MVC WebApi 站点 该站点具有基于 James Still 博客文章的 RabbitMQ 订阅者使用 RabbitMQ 进行真实世界的 PubSub 消息传递 http www squarew
  • ASP.NET Core 2.0 Razor 与 Angular/React/等

    我开始开发企业级 Web 应用程序 该应用程序将有许多单独的网页 但其中两个页面更集中且非常繁重 繁重 如大量用户交互 显示大量数据的模式 Websocket 连接 聊天等 我被任命为该项目的首席架构师 因此我正在对最新的 Web 框架进行
  • 使用 RabbitMQ 的工作池和多租户队列

    我开发的 Web 应用程序是一个基于多租户云的应用程序 很多客户端 每个客户端都有自己独立的 环境 但都在共享的硬件集上 我们正在引入用户批量处理的功能为后期处理工作 批处理工作的类型实际上并不重要 只是数量足够 没有工作队列就不太实际 我