Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 分解并加速Rake任务_Ruby_Sinatra_Rake - Fatal编程技术网

Ruby 分解并加速Rake任务

Ruby 分解并加速Rake任务,ruby,sinatra,rake,Ruby,Sinatra,Rake,我们的应用程序有一个功能,需要在所有用户每天的特定时间运行rake-tast。这涉及到计算它们的一些属性,运行db查询,并向每个用户发送推送通知。因此,任务被设计为在O(n)中运行,但这仍然意味着随着用户群的增加,完成任务的总时间会增加。我们希望任务在不超过一分钟的时间内完成—14000个用户需要8分钟,而且CPU利用率也在不断增加(在一天剩下的时间里,平均CPU利用率约为10%,但在任务运行时会上升到50%)。我想在这里解决两个问题-使任务在更短的时间内运行,并降低cpu使用率和任务运行峰值

我们的应用程序有一个功能,需要在所有用户每天的特定时间运行rake-tast。这涉及到计算它们的一些属性,运行db查询,并向每个用户发送推送通知。因此,任务被设计为在O(n)中运行,但这仍然意味着随着用户群的增加,完成任务的总时间会增加。我们希望任务在不超过一分钟的时间内完成—14000个用户需要8分钟,而且CPU利用率也在不断增加(在一天剩下的时间里,平均CPU利用率约为10%,但在任务运行时会上升到50%)。我想在这里解决两个问题-使任务在更短的时间内运行,并降低cpu使用率和任务运行峰值

技术规范-Sinatra应用程序为应用程序提供API,运行在Phusion Passenger(nginx模块)上,使用MongoDB并部署在c3.2大型ec2实例上


另外,我不知道Ruby是如何进行并行处理和线程处理的,也不知道Ruby能否解决这个问题,但是,对所有用户进行bucking并并行计算这些bucket可以解决问题吗?如果是这样的话,我该怎么做呢?我不想仅仅为了这个目的而购买一台更大的服务器,因为像我上面指出的那样,剩下的时间它很容易处理请求。

你需要一个后台工作人员。然后,您可以将您的用户分成(比如)1000个批次,并安排这些批次进行处理。通过这种方式,您可以通过更改工人数量来调整总处理时间。更多的工人-使用更多的资源,但总时间更少。您可能还需要几台机器供工人使用(以分散负载)。一个好的背景工作解决方案是sidekiq。其他包括resque,delayed_job。谢谢@SergioTulentsev,谢谢你的投入。我确实在我们的解决方案中使用Sidekiq来传递通知,比如新消息,但不确定Sidekiq是否足够可靠,能够处理前面提到的大型任务。如果我选择Sidekiq方式,您会建议哪些最佳实践来确保任务成功运行或在失败时自动重启?完成这些批处理任务非常重要。我会在谷歌上搜索这些问题,但也希望你能有同样的见解。Sidekiq已经准备好生产了。它甚至还具有开箱即用的自动重启功能,IIRC。所以您应该都准备好了。@SergioTulentsev我还没有尝试Sidekiq,但我尝试在
fork do end
块之间包含每个bucket的计算任务。我注意到,虽然任务运行速度明显加快,但它也耗尽了我的cpu。这样的分叉是一种不好的做法吗?或者什么东西可以在不消耗太多CPU的情况下运行分叉?我很快就会用Sidekiq为我做的事情来更新这个线程。如果你把cpu密集型的工作分散到多个cpu上,工作会完成得更快,因为会有更多的cpu。不知道有什么让你惊讶。你需要一个背景工作人员。然后,您可以将您的用户分成(比如)1000个批次,并安排这些批次进行处理。通过这种方式,您可以通过更改工人数量来调整总处理时间。更多的工人-使用更多的资源,但总时间更少。您可能还需要几台机器供工人使用(以分散负载)。一个好的背景工作解决方案是sidekiq。其他包括resque,delayed_job。谢谢@SergioTulentsev,谢谢你的投入。我确实在我们的解决方案中使用Sidekiq来传递通知,比如新消息,但不确定Sidekiq是否足够可靠,能够处理前面提到的大型任务。如果我选择Sidekiq方式,您会建议哪些最佳实践来确保任务成功运行或在失败时自动重启?完成这些批处理任务非常重要。我会在谷歌上搜索这些问题,但也希望你能有同样的见解。Sidekiq已经准备好生产了。它甚至还具有开箱即用的自动重启功能,IIRC。所以您应该都准备好了。@SergioTulentsev我还没有尝试Sidekiq,但我尝试在
fork do end
块之间包含每个bucket的计算任务。我注意到,虽然任务运行速度明显加快,但它也耗尽了我的cpu。这样的分叉是一种不好的做法吗?或者什么东西可以在不消耗太多CPU的情况下运行分叉?我很快就会用Sidekiq为我做的事情来更新这个线程。如果你把cpu密集型的工作分散到多个cpu上,工作会完成得更快,因为会有更多的cpu。不知道有什么让你惊讶。