如何在Google App Engine上尽快创建X任务

时间:2012-03-09 12:47:53

标签: google-app-engine android-c2dm task-queue

我们推出了来自GAE的警报,并且假设我们需要向CD2M(云2设备消息传递)推出50 000个警报。为此我们:

  1. 阅读所有想要从数据存储区发出警报的人
  2. 循环并为每个通知创建“推送任务”
  3. 问题是创建任务需要一些时间,因此当用户群增长时,这不会扩展。根据我的经验,当有很多任务时,我们只需要20-30秒来创建任务。一个任务的原因pr。推送消息是这样的,如果出现故障,我们可以重试该任务,它只会影响单个用户。此外,C2DM仅支持一次向一个用户发送。

    如果我们这样做会更快吗?

    1. 阅读所有想要从数据存储区发出警报的人
    2. 循环并为每100个订阅者创建一个“池任务”
    3. 每个“池任务”在执行
    4. 时将生成100个“推送任务”

      任务执行速度非常快,因此在我们的场景中,任务的创建似乎是瓶颈,而不是任务的执行。这就是为什么我认为这种情况能够增加应用程序的并行性。我猜这会导致更快的执行但是我可能会错的:-)

2 个答案:

答案 0 :(得分:1)

我们使用APNS(Apple推送通知服务器)执行类似操作:我们一次为一批通知创建任务(=您调用的池任务)。当任务执行时,我们遍历批处理并将其发送到推送服务器。

与您的设置的不同之处在于我们有一个单独的服务器用于与推送通信,因为APNS仅支持套接字通信。

唯一的缺点是如果出现错误,则会重复整个任务,并且某些用户可能会收到两个通知。

答案 1 :(得分:1)

这听起来好像根据您需要发送的警报数量,发送每个警报需要多长时间以及您运行的活动实例数量而有所不同。

我的猜测是发送CD2M警报需要几毫秒到几十毫秒,而实例启动需要几秒钟,所以你可能会发出几百或几千警报证明另一个任务实例。发送每个CD2M消息所花费的时间与启动实例所需的时间之比将决定每个任务要发送的消息数量。

如果你已经运行了相当数量的实例,那么你没有等待实例启动的延迟。

BTW,这看起来几乎就像是MapReduce API的完美应用。它主要执行您在第二个版本中描述的内容,除了它接受您的初始查询,并将其分解为子查询,每个子查询返回结果集的“页面”。为每个子查询启动一个任务,该子查询处理其“页面”中的所有项目。这是对您描述的改进,因为您不需要花时间循环初始结果集。

我相信MapReduce API的默认实现只是查询特定类型的所有实体(即所有用户对象),但您可以更改使用的过滤器。