【问题标题】:How to create X tasks as fast as possible on Google App Engine如何在 Google App Engine 上尽快创建 X 任务
【发布时间】:2012-03-09 12:47:52
【问题描述】:

我们从 GAE 推送警报,假设我们需要向 CD2M(Cloud 2 Device Messaging)推送 50 000 个警报。为此,我们:

  1. 读取所有想要从数据存储中获取警报的人
  2. 循环并为每个通知创建一个“推送任务”

问题是任务的创建需要一些时间,因此当用户群增长时,它不会扩展。根据我的经验,当有很多任务时,我们只需要 20-30 秒就可以创建任务。一项任务公关的原因。推送消息是为了让我们可以在失败时重试任务,并且只会影响单个订阅者。此外,C2DM 一次只支持发送给一个用户。

如果我们这样做会更快:

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

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

【问题讨论】:

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


    【解决方案1】:

    我们对 APNS(Apple Push Notification Server)做了类似的事情:我们一次为一批通知创建一个任务(= 你称之为池任务)。当任务执行时,我们迭代一个批次并将其发送到推送服务器。

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

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

    【讨论】:

    • 我们将 Urban Airship 用于 iOS 通知,它们非常快,但对于 Android,我们自己做,这就是我们延迟的地方。但是既然你已经实现了我正在考虑做的事情,那么我希望我们都在思考正确的事情,所以我会接受这个答案:-)
    【解决方案2】:

    这听起来会根据您需要发送的警报数量、发送每个警报所需的时间以及您正在运行的活动实例的数量而有所不同。

    我的猜测是发送 CD2M 警报需要几毫秒到几十毫秒,而实例启动需要几秒钟,因此您之前可能会发出几百或几千个警报证明另一个任务实例的合理性。发送每条 CD2M 消息所需的时间与启动实例所需的时间的比率将决定您希望为每个任务发送多少条消息。

    如果您已经有相当数量的实例在运行,那么您不必等待实例启动。

    顺便说一句,这似乎是 MapReduce API 的完美应用。它主要执行您在第二个版本中描述的内容,除了它需要您的初始查询,并将其分解为子查询,每个子查询都返回结果集的“页面”。为每个处理其“页面”中所有项目的子查询启动一个任务。这与您所描述的相比有所改进,因为您无需花时间遍历初始结果集。

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

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      相关资源
      最近更新 更多