如何在云中提供CPU密集型Web服务请求?

时间:2012-11-02 19:58:41

标签: web-services google-app-engine concurrency cloud rackspace

后台:我正在运行一个网络服务,其中每个请求都涉及相当多的计算(在四核计算机上最多10秒)。

每个请求可以分解为大约150个独立(同样小)的子任务。

我追求的是什么:我正在寻找一种托管服务,让我能够以可扩展的方式有效地提供这些类型的请求。

我考虑过的事情:我研究过Google App Engine和Rackspace。

在我看来,好像GAE是针对简单的请求,需要处理的litte资源。像Rackspace这样的问题是我无法预先知道我可能需要多少个vCPU(即使我知道未来会有多大的峰值,我也不想坐下来,比如40个服务器闲置其余的时间)

问题:

  1. 是否可以通过以下方式使用GAE:

    1. 对于每个请求,请将其拆分为150个子任务

    2. 通过对同一个webapp执行150个并发HTTP请求(但通过不同的方法)独立处理所有子任务

    3. 收集“子结果”的结果并返回对原始请求的回复。

  2. Map Reduce for GAE是否有可能提供任何帮助?

  3. 还有其他服务更适合此任务吗?

2 个答案:

答案 0 :(得分:1)

  1. 是的,这是可能的。通常的方法是使用Task Queue,可能通过DeferredTask助手类。

    1.3正常的Web请求(到前端实例)限制为30秒,因此无法保证同步执行此操作。另请注意,实例被人为限制为执行10个并行请求(如果启用了多线程)。

  2. 是的,这是map reduce的工作。但请注意,map reduce是异步的 - 你可以给它任务,它将在未来的某个时候完成。

  3. 根据您需要的处理,您可能需要查看GAE backends(他们长时间使用multithrading并进入different sizes)。如果您需要更强大的处理能力,那么您可能需要查看Compute Engine

答案 1 :(得分:0)

除非所有这150个子任务都是只读活动,否则尝试在一个线程中运行它们并不安全。 Web请求不可靠 - 人们可以取消,如果花费太长时间点击刷新,中间关闭窗口,或者由于网络问题而暂停。同样,后台HTTP请求可能会出现大量问题。标准解决方案是让您的前端代码只是构建一个需要完成的事情列表,这样它可以快速返回给用户,并让后端“工作”进程处理(可能不可靠)子任务。根据您的应用程序正在执行的操作,您可能会将用户弹出“工作”屏幕(例如搜索机票价格),他们可以安全等待结果出现,或者可能只是填充远离作为“待定”工作(比如从亚马逊订购东西)。

处理这个基本工作流程的方法有很多种。如果你坚持使用谷歌应用引擎,他们有一个“任务队列”作为part of the platform - 提供一个简单的机制来创建&派遣后台任务。如果您使用Rackspace,他们的云产品不是一个统一的平台,因此您必须自己滚动队列或插入一个插入您的设置。