Rails & Heroku:我需要多少 workers/dynos

Rails & Heroku: How many workers/dynos do I need

我有一个火种风格的应用程序,允许用户对事件进行评分。用户对事件进行评分后,将运行后台重新请求作业,根据用户的反馈对其他事件进行重新排名。

此后台作业大约需要 10 秒,每个用户每分钟运行大约 20 次。

使用一个简单的例子。如果我有 10 个用户在任何给定时间使用该应用程序,并且我不想等待工作,那么最佳方法是什么?

我对 Dynos、resque 池和 redis 连接感到困惑。有人可以帮我理解其中的区别吗?有没有办法计算这个?

Dynos:这些是单独的 virtual/physical 服务器。将它们视为与 EC2 实例相同。

Redis 连接:与 Redis 实例的单独连接。

Resque Pool:一个 gem 允许您 运行 worker 在同一个 dyno/instance.

上同时工作

首先,值得寻找可以提高工作本身绩效的方法。通过使用低级模型缓存或优化您的算法,您可能能够将它缩短到十秒以内。

就计算出您需要多少工人而言,您需要用每分钟 运行 秒 (20) 乘以达到 运行 所需的秒数( 10) 乘以用户数 (10)。这将为您提供一名工人每分钟 运行 所需的秒数。 20 * 10 * 10 = 2000。将其除以 60,得到每分钟的分钟数 33.3。所以如果你有 34 名工人,并且这些数字都是一致的,他们应该能够掌握一切。

也就是说,您不应该处于需要 运行 仅 10 个并发用户进行 36 个或更多测功机的排名算法的位置。那很快就会变得昂贵。

优化你的算法,尝试添加更多缓存,也试试 Sidekiq。根据我的经验,Sidekiq 处理队列的速度比 Resque 快 10 倍。这取决于您的工作内容,以及您如何使用每种工具,但值得一试。参见 Sidekiq vs Resque

不确定您问的问题是否正确。您真正的问题是 "how can I get better performance?" 而不是 "how many dynos?" 仅添加测功机不一定会给您带来更好的性能。更多的测功机给你更多的内存...所以如果你的应用程序 运行ning 缓慢因为你 运行ning 可用内存不足(即你 运行ning 交换),那么更多的dynos可能就是答案。如果这些作业每个都需要 10 秒才能完成 运行,但是...内存可能不是您的实际问题。如果您想监控内存使用情况,请查看像 New Relic 这样的可视化工具。

有很多方法可以解决您的问题。但我将从您编写的代码开始。 Post在 SO 上编写一些代码可能有助于理解为什么该作业需要 10 秒(Post 一些代码!)。 10秒是很长的时间。因此,优化该作业中的查询几乎肯定会有所帮助。

另一个容易实现的目标...从 resque 切换到 sidekiq 以进行后台作业。真的很容易使用。您将使用更少的内存,并且应该会立即看到性能提升。

重新排列其他事件不是一个好主意。

您应该考虑为事件 table 设置 total_points 和 average_points 列,并让排名由查询的顺序决定。像这样。

class Event
    has_many :feedbacks

    scope :rank_by_total, -> { order(:total_points) }
    scope :rank_by_average, -> { order(:average_points) }
end

class Feedback
    belongs_to :event
    after_create :update_points

    def update_points
        total = event.feedbacks.sum(:points)
        avg = event.feedbacks.average(:points)
        event.update(total_points: total, average_points: avg)
    end
end

那么,你需要多少个workers/dynos?

这个问题你不用担心dyno或者worker。无论您使用多少具有更高处理能力的测功机,当您的事件 table 变得巨大时,您的解决方案将花费大量时间。因此,请尝试按照我描述的方式更改您的解决方案。