以下是我对每种方法的想法:
不,不应该。有些计算在您的数据库中运行会快得多,有些则不会。但是,准确测试应该在您的数据库中运行哪些计算将是困难且耗时的,并且您会正确体验到算法的某些部分在 postgreSQL 或您使用的任何东西中都很慢。更重要的是:这不是运行逻辑的正确位置,正如您自己所说,这将很难测试,而且总体上是一种不好的做法。每次数据库必须计算算法时,它也会影响整体请求的性能。此外,数据库仍然会使用大量内存来处理这个,所以这不是一个优势。
迄今为止最好的解决方案。有关更多说明,请参见下文。
这是一个比第一个更好的解决方案。但是,这意味着您的应用程序性能将非常不稳定。有时所有资源对于正常请求都是免费的,有时您会在计算中使用所有资源。
选项 2 是最好的解决方案,因为这不会影响应用程序其余部分的性能,并且由于它是独立工作的,因此更容易扩展。例如,如果您遇到工作人员跟不上进度,您可以添加更多正在运行的进程。
更重要的是,您将能够在单独的服务器上运行后台进程,从而轻松监控内存和资源使用情况,并根据需要扩展您的服务器。
即使对于实时更新,后台作业也是最好的解决方案(当然,如果计算不足以在请求中完成)。您可以创建一个“高优先级”队列,该队列有足够的资源几乎总是空的。如果您需要通过重新加载向用户显示结果,则必须在后台作业完成后添加某种推送通知。然后,此通知可以通过 javascript 触发页面上的更新(您还可以查看 rails 4 的新直播功能)。
我会推荐类似Sidekiq和 Redis 的东西。然后,您可以将结果缓存在 memcache 中,或者您可以每次重新计算结果,这实际上取决于您需要多久计算一次。但是,使用此解决方案,如果需要,设置稳定的缓存会容易得多。
在我工作的地方,我们有一个应用程序运行一些繁重的查询,并进行大量这样的计算。每天晚上,这些作业都会排队,然后在接下来的几个小时内在隔离的服务器上运行。这可以很好地扩展,并且也很容易使用新遗物进行监控。
希望这会有所帮助,并且有意义(我知道我的英语并不完美),但请随时询问我是否误解了某些内容或您有更多问题。