1

我有一种情况,我想对数据存储区进行 1000 个不同的查询,对每个单独查询的结果进行一些计算(以获得 1000 个单独的结果),然后返回结果列表。

我希望将结果列表作为开始计算的相同 30 秒用户请求的响应返回,以获得更好的客户端性能。哈!

我有一个大胆的计划。

这些操作中的每一个通常在一秒钟内完成都没有问题,它们都不需要像任何其他操作一样写入相同的实体组,并且它们都不需要来自任何其他查询的任何信息。是否有可能启动 1000 个独立任务,每个任务都处理其中一个查询,进行计算,并将结果存储在某种临时实体集合中?原始请求可能会等待 10 秒,然后对数据存储中的结果进行一次查询(也许它们都设置了一个我可以查询的唯一值)。任何尚未出现的结果都会在客户端被注意到,并且客户端可以在另外十秒钟内再次请求这些值。

我希望有经验的应用工程师能回答的问题是:

  • 这很荒谬吗?如果是这样,对于任何数量的任务来说都是可笑的吗?一次50是否合理?
  • 如果我每秒读取同一个实体 20 次,我不会遇到数据存储争用,对吗?那些争论的东西都是为了写?
  • 有没有更简单的方法来从任务中获得响应?
4

2 回答 2

1

是的,听起来很可笑:)

您不应该依赖 Taskqueue 那样操作。您不能依赖如此快速地生成 1000 个任务(尽管它们很可能会如此)。

为什么不使用 Channel API 来等待您的响应。所以你的解决方案变成:

  • 客户端向服务器发送请求
  • 服务器生成 N 个任务来进行计算并使用 Channel API 令牌响应客户端
  • 客户端使用令牌监听 Channel
  • 完成所有任务后,服务器通过通道向客户端推送响应

这将避免任何超时问题,这些问题很可能由于任务执行速度不快或其他原因而不时出现。

于 2011-04-05T17:00:14.937 回答
1

任务队列不提供关于任务何时执行的确切保证 - ETA(默认为当前时间)是它执行的最早时间,但如果队列已备份,或者没有可用的实例要执行任务,它可以在很久以后执行。

一种选择是使用Datastore Plus / NDB,它允许您并行执行查询。但是,无论您如何执行它们,1000 个查询都将非常昂贵。

正如@Chris 建议的那样,另一种选择是将任务队列与 Channel API 一起使用,这样您就可以在查询完成时异步通知用户。

于 2011-04-06T01:31:24.747 回答