【问题标题】:Sidekiq - Keep one client from using all workersSidekiq - 阻止一个客户使用所有工作人员
【发布时间】:2017-05-16 05:31:52
【问题描述】:

我们的应用拥有许多不同的客户。我们允许客户执行长时间运行的任务,例如导入大型 CSV 文件。目前,我们通过一次只允许每个客户端 1 个导入并在单个作业中运行整个导入来保持公平。

我们希望将大型作业拆分为许多较小的作业,例如将 10,000 行 CSV 导入到 10,000 个 1 行导入中。这样做的问题是,单个长作业可能会使用所有处理能力,从而推迟另一个客户端通常会同时运行并快速完成的短作业。

我们有成千上万的客户,他们每天/每周都会添加。

是否有某种方法可以在客户端之间公平地共享工作人员,而不会破坏具有数千个队列的设置文件? (This question 类似,但并没有真正得到好的答案。)

【问题讨论】:

    标签: sidekiq


    【解决方案1】:

    将导入作业放入低优先级队列。将短作业放入默认队列,这样短作业总是在低优先级的东西之前被拾取。

    【讨论】:

    • 是的。我们已经这样做了。但是,一个客户端的导入可能需要 1 小时,而另一个客户端的导入可能需要 1 秒。这就是我正在考虑的场景。我们可以按工作规模设置优先级,但这可能会导致疯狂。我只是想要一种干净的方式来公平地按帐户分配资源。我认为企业速率限制并发可能会有所帮助,但我认为不会。
    • 正如你所指出的,如果进口被分成许多小工作,那没关系。
    • 在某种程度上,是的,确实如此。在我上面的例子中,如果我有 25 个线程并且 1 小时的作业可以完美地扩展,使其在 2.4 分钟内运行,这仍然意味着如果他们启动它,有几秒钟作业的人将不得不等待 2.4 分钟才能完成它之后,对吧?
    • 没有。 Sidekiq 将在每个小型导入作业之后检查优先级更高的作业。
    最近更新 更多