【问题标题】:Limit the number of background workers per user in Rails在 Rails 中限制每个用户的后台工作人员数量
【发布时间】:2018-11-11 21:58:57
【问题描述】:

我有一个 Rails 应用程序,其中每个用户都有特定数量的后台工作人员。

由于用户支付更多费用来增加可用工人的数量,我希望能够动态添加这些工人。

我想将ActiveJobSidekiq 结合使用,我想到了以下解决方案:

  • 当用户注册时,我用用户的id 在sidekiq 中创建一个新队列。
  • 我添加了一些工作人员,专门用于该特定队列,具体取决于用户支付的费用。

我在使用 Sidekiq 实施此解决方案时遇到问题,我找不到有关如何动态添加队列和工作人员的文档。

【问题讨论】:

  • 是的,这种队列/工人的杂耍不是很容易或可扩展的。

标签: ruby-on-rails sidekiq rails-activejob


【解决方案1】:

如果我要这样做,这是我首先要尝试的:

  • 将所有有限的工作打包在一个柜台中。
  • 在启动/出列作业时检查此用户是否有能力运行它。
  • 如果是,则作业运行。如果没有,它会自行重新安排。

类似的东西:

class MyWorker
  def perform(user_id, *args)
    user = User.find(user_id)
    unless user.has_available_workers
      # re-enqueue with the same args. Possibly, with a delay.
      return 
    end

    user.checkout_worker
    # do work
  ensure
    user.release_worker
  end
end

【讨论】:

  • 我喜欢您的解决方案,但在这种情况下,所有用户都将共享工作人员,而没有专门的工作人员。这不一定是一个坏主意:它甚至可以更好地扩展,但可能没有更多可用的工作人员并且用户必须等待(最坏的情况,因为他付费了)
  • @coorasse:确实。在这种情况下,您可能希望过度配置工作人员,以便始终有一些空闲容量。如果您提供付费服务,这无论如何都是个好主意。
  • 同意。我仍然想念如何在不重新启动应用程序的情况下动态添加工作人员。这不是一个杀手级功能,我总是可以重新启动服务器,但是看看 Sidekiq 是否可能会很有趣
  • @coorasse:添加工人?您可以开始一个新的 sidekiq 进程。无需重新启动/触摸活动的。有趣的 devops 任务。
猜你喜欢
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
相关资源
最近更新 更多