Rails&Heroku:我需要多少个工作人员/ dynos
我有一个允许用户对事件进行评分的火警风格应用程序。用户对事件进行评级后,会运行后台再执行作业,根据用户的反馈重新排列其他事件。Rails&Heroku:我需要多少个工作人员/ dynos
此后台作业大约需要10秒钟,每个用户每分钟运行约20次。
使用一个简单的例子。如果我有10个用户在任何特定时间使用该应用程序,并且我从不想要一份工作等待,那么执行此操作的最佳方式是什么?
我对Dynos,resque pool和redis连接感到困惑。有人能帮我理解这个区别吗?有没有办法计算这个?
不知道你问的是正确的问题。你真正的问题是“我怎样才能获得更好的表现?”不是“多少个dynos?”只需添加dynos并不一定会让您获得更好的性能。更多的dynos给你更多的记忆......所以如果你的应用程序运行缓慢,因为你的内存不足(即你正在运行swap),那么更多的dynos可能就是答案。如果这些工作需要10秒才能运行,尽管......内存可能不是你的实际问题。如果你想监视你的内存使用情况,请查看一个可视化工具,如New Relic。
有很多方法可以解决您的问题。但是我会从你写的代码开始。在SO上发布一些代码可能有助于理解为什么这项工作需要10秒(发布一些代码!)。 10秒钟是很长的时间。因此,优化该作业中的查询几乎肯定会有所帮助。
另一块低挂水果...从resque切换到sidekiq为您的后台工作。真的很容易使用。您将使用更少的内存,并且应该会看到性能上的瞬间上涨。
我打算在SO上发布另一个关于更多细节的问题。谢谢! –
这是一个更彻底的问题:http://stackoverflow.com/questions/40115387/rails-heroku-and-resque-long-running-background-job-optimization/40115470#40115470 –
Dynos:这些是单独的虚拟/物理服务器。将它们想象为与EC2实例相同。
Redis连接:与Redis实例的单独连接。
Resque Pool:允许您在同一个dyno /实例上同时运行工人的gem。
因此,如果我发现我的队列中有太多的工作,我需要更多的dynos或redis连接或其他东西? –
如果工作正在进行备份,则需要更正该工作人员的动态计数。您还需要确保您有一个可以处理您拥有的工作人员数量的redis实例。 –
首先,值得寻找可以提高作业本身性能的方法。通过使用低级模型缓存或优化算法,您可能会在10秒以内获得它。在计算你需要多少工人时,你需要以每分钟(20)乘以运行(10)乘以用户数(10)所花费的秒数来计算运行次数(20次) 。这会给你每分钟需要运行一个工人的秒数。 20 * 10 * 10 = 2000
。除以60,你有每分钟的分钟数,33.3
。所以如果你有34名工人,而且这些数字都是一致的,他们应该能够保持最佳状态。
也就是说,您不应该处于需要针对排名算法仅为10个并发用户运行36个或更多个dynos的位置。这将非常迅速地变得昂贵。
优化你的算法,尝试添加更多的缓存,并给Sidekiq一个尝试。根据我的经验,Sidekiq可以处理比Resque快10倍的队列。这取决于你的工作在做什么,以及你如何利用每个工具,但值得一试。见Sidekiq vs Resque。
谢谢,我来看看。 –
重新排列其他事件是一个坏主意。
您应该考虑为事件表提供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
所以,多少工人/ DYNOS你需要什么?
您不需要担心测功机或工人对此问题。无论您使用多少处理能力更强的dynos,当您的事件表变得庞大时,您的解决方案将花费大量时间。因此,请按照我所描述的方式尝试更改解决方案。
但我们的事件排名是个性化的给每个用户。这不是热门程度,它是基于他们喜欢的过去事件与特定用户的关联 –
所以我的想法是:事件has_many event_rankings和event_ranking belongs_to用户。所以每个用户都有自己的事件排名...... –
为什么每个用户每分钟运行20次?为什么不仅在用户排名事件时运行? – toddmetheny
这正是它所做的,用户每分钟刷新20个事件(“喜欢”或“不喜欢”) –