Rails&Heroku:我需要多少工人/探险家
我有一个允许用户评价事件的火苗式应用程序。 用户对事件进行评级后,会运行后台再执行作业,根据用户的反馈重新排列其他事件。
此后台作业大约需要10秒钟,每个用户每分钟运行约20次。
用一个简单的例子。 如果我有10个用户在任何特定时间使用该应用程序,并且我从不想要一份工作等待,那么执行此操作的最佳方式是什么?
我对Dynos,resque pool和redis连接感到困惑。 有人能帮我理解这个区别吗? 有没有办法计算这个?
不知道你问的是正确的问题。 你真正的问题是“我怎样才能获得更好的表现?” 不是“多少个dynos?” 只需添加dynos并不一定会让您获得更好的性能。 更多的dynos给你更多的记忆......所以如果你的应用程序运行缓慢,因为你的内存不足(即你正在运行swap),那么更多的dynos可能是答案。 如果这些工作需要10秒才能运行,尽管......内存可能不是你的实际问题。 如果你想监视你的内存使用情况,请查看一个可视化工具,如New Relic。
有很多方法来解决你的问题。 但是我会从你写的代码开始。 在SO上发布一些代码可能有助于理解为什么这项工作需要10秒(发布一些代码!)。 10秒钟是很长的时间。 因此,优化该作业中的查询几乎肯定会有所帮助。
另一块低挂水果......从resque切换到sidekiq作为您的后台作业。 真的很容易使用。 您将使用更少的内存,并且应该会看到性能上的瞬间上涨。
Dynos:这些是单独的虚拟/物理服务器。 将它们想象为与EC2实例相同。
Redis连接:与Redis实例的单独连接。
Resque Pool:一个gem,允许你在同一个dyno /实例上同时运行工作。
首先,值得寻找可以提高工作绩效的方法。 通过使用低级模型缓存或优化算法,您可能会在10秒以内获得它。
在计算你需要多少工人时,你需要以每分钟运行数(20)乘以运行(10)乘以用户数(10)的秒数。 这会给你每分钟需要运行一个工人的秒数。 20 * 10 * 10 = 2000
。 除以60,每分钟的分钟数为33.3
。 所以如果你有34名工人,而且这些数字都是一致的,他们应该能够保持最佳状态。
也就是说,对于排名算法,您不应处于需要为10个并发用户运行36个或更多个dynos的位置。 这将非常迅速地变得昂贵。
优化你的算法,尝试添加更多的缓存,并给Sidekiq一个尝试。 根据我的经验,Sidekiq可以处理比Resque快10倍的队列。 这取决于你的工作在做什么,以及你如何利用每个工具,但值得一试。 见Sidekiq vs Resque。
链接地址: http://www.djcxy.com/p/93583.html