首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于RabbitMQ的公平分布式任务调度

基于RabbitMQ的公平分布式任务调度
EN

Software Engineering用户
提问于 2018-06-01 21:04:53
回答 2查看 2K关注 0票数 8

问题:我们系统的单个客户端可以用大量的工作负载完全淹没所有可用的资源。您可以考虑我们只有一个队列,任何人都可以在其中安排任意数量的工作。随后提交少量工作的任何其他客户端都必须等到第一批任务得到充分处理后才能完成。这是一个异步系统,所以它将不会对DOS有风险。我们想要解决的问题是允许我们的客户在任何时候都有相当数量的处理,不管是否有几个客户提交了大量的工作。它是一个分布式系统,有大量的工作人员,所有的工作都是小块的,所以任务在系统中正确地流动。

对我来说,这似乎是一个很常见的问题,我有点担心,因为我没有找到一个非常简单的解决方案。它类似于操作系统中的进程调度,因为进程是以循环方式给出处理槽的,没有一个进程能够预先安排大量的工作。

一种解决方案是使用特定的队列拓扑。每个用户有一个队列,为一个有限制的小队列提供信息。由于后一个队列的工作量很小,没有一个过程能够垄断工人的工作时间。像这样

我原以为这在RabbitMQ或可能的ZeroMQ中很容易实现,但也存在一些挑战。首先,如果一个新用户提交工作,我需要手动创建一个新队列。其次,也是更重要的是,我似乎必须自己实现red部分,以非阻塞的方式侦听所有队列,以便将它们提交到有界队列中。

我关心的是,我在这里处理的是非常低层次的抽象,我想要的只是对容量限制的公平的任务调度。基本上,创建一些背压,允许调度发生在实际工作之前,因此不允许任何用户单一的系统。

是否有更好的抽象概念可供使用?

EN

回答 2

Software Engineering用户

发布于 2018-06-03 06:58:20

我认为你所勾画的模式是常见的。(您可以编写自己的“路由工作器”),但可以将其压缩,将路由逻辑(红色)移动到工作程序中。

例如,我添加了知道用户的代码,而不是监听单个队列的工作人员。

然后,我可以在同一个工作服务中触发每个用户队列中的一个线程,并让cpu将其时间分散在每个线程上。

对于大量用户或与CPU绑定的任务,它可能稍微不太理想,但它将简化您的整体解决方案。

按照类似的思路,如果您能够传递成本,一个很好的解决方案是在云中的新机器上配置一个新员工,以及为每个用户提供一个队列。

票数 1
EN

Software Engineering用户

发布于 2018-09-21 16:50:40

我不确定我是否同意这个问题的前提--这就是为什么。

数学理论

根据排队论的说法,在任何先到先出的随机过程中,请求的到达率和处理服务请求所需的平均时间。然后,该流程按照泊松过程的规则操作,我们可以分析地判断队列长度在任何一点上可能是多长时间,以及进程的吞吐量。

因此,从分析/设计的角度来看,我们必须确保一些假设是正确的:

  • 请求的到达是一个指数分布的随机变量。
  • 单个请求的服务时间是指数分布的随机变量。

在实践中,这些假设很难精确满足,但它们提供了足够好的近似来进行一些基本的设计和分析。如果这些请求被严重违反(例如,您的系统处理批请求,或者某些请求所用的时间要比其他请求长得多),那么您的设计工作应该集中在将系统带入一个不再违背基本假设的状态。

情况

因此,鉴于以上所述,我将假设您有一个随机过程,请求到达率l和服务时间m,以及处理器数量c。如果c*m小于您的到达率,那么您的进程就会不稳定,队列大小也会变大。

因此,您的系统设计的目标是确保在所有合理的时间内,都有足够的处理器(c)可以根据典型的请求处理时间(m)在间隔(~l)期间满足预期到达的请求,并且在系统(包括队列)中花费合理的最大时间。

如果您已经这样做了,那么您已经充分地设计了系统,以满足它希望处理的请求。在实践中,这种方法适用于如此多的情况,以至于我不知道在这些类型的系统中常用的任何其他排队方法。你可以在没有先发制人的情况下设置优先排队(类似于机场办理登机手续的头等舱车道),但这怎么会更“公平”呢?

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/371958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档