-1

背景:我正在运行一个 Web 服务,其中每个请求都涉及大量计算(在四核机器上最多 10 秒)。

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

我所追求的:我正在寻找一种托管服务,它允许我以可扩展的方式有效地服务这些类型的请求。

我所考虑的:我研究了 Google App Engine 和 Rackspace。

在我看来,GAE 似乎适用于简单的请求,需要少量资源来处理。Rackspace 之类的问题是我无法提前知道我可能需要多少个 vCPU(即使我知道未来的峰值会有多大,我也不想坐 40 台服务器闲置其余的时间)

问题:

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

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

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

    3. 从“子结果”中收集结果并返回对原始请求的响应。

  2. GAE 的 Map Reduce 是否有任何帮助?

  3. 还有其他更适合这项任务的服务吗?

4

2 回答 2

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

    1.3 正常的网络请求(对前端实例)被限制在 30 秒,因此以同步方式执行此操作并不能保证成功。另请注意,实例被人为地限制为执行 10 个并行请求(如果启用了多线程)。

  2. 是的,这是map reduce的工作。但请注意,map reduce 是异步的——你给它任务去做,它会在未来的某个时候完成。

  3. 考虑到您需要的处理,您可能需要查看GAE 后端(它们长期运行多线程并且具有不同的大小)。如果您需要更多的处理能力,那么您可能需要查看Compute Engine

于 2012-11-03T10:59:37.487 回答
0

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

有无数种不同的方式来处理这个基本的工作流程。如果您坚持使用 Google App Engine,他们有一个“任务队列”作为平台的一部分- 提供了用于创建和调度后台任务的简单机制。如果您使用 Rackspace,他们的云产品就不是一个统一的平台,因此您必须创建自己的队列或让一个队列插入您的设置。

于 2012-11-03T22:45:07.133 回答