【问题标题】:Google app engine API: Running large tasksGoogle 应用引擎 API:运行大型任务
【发布时间】:2016-04-04 05:50:02
【问题描述】:

早安,

我正在将应用程序的后端作为应用程序引擎 (Java) 运行。 使用端点,我收到请求。问题是,我需要计算一些大的东西,但我需要前端的快速响应时间。因此,作为一种解决方案,我想预先计算一些东西,并将其存储在专用的内存缓存中。

我这样做的方式是添加一个静态块,然后在默认队列上运行一个延迟任务。 有没有更好的方法在启动时进行计算?

现在,此延迟任务执行大量数据存储操作。有时,它们会超时。所以我创建了一个系统,它会在超时重试直到成功。但是,当我启动应用程序引擎时,它会立即创建两个延迟任务。尽管我设置了 DeferredTaskContext.setDoNotRetry(true);,但它也会在任务失败时继续重试任务。

老实说,延迟的任务感觉非常挑剔。

我只想运行一个需要 5 分钟以上的方法(随着数据集的增长可能会更长)。我想在启动时运行此方法,然后定期运行。您将如何建模?我的第一个想法是 cron 工作,但时间有限。我需要一个运行延迟任务的 cron 作业,希望它们不会以某种方式堆积或产生重复项或开始重试。

感谢您的帮助和美好的一天。

干燥

【问题讨论】:

  • cron 作业与延期任务的截止日期相同
  • 您将如何跨实例共享/访问此数据(分类器)。请记住,每个实例都有自己的内存。所以目前我想你每次实例启动时都会启动这个构建。一旦处理完毕,可以将其序列化为
  • 这是我的主要问题,它不能轻易地在数据存储中的单个块中序列化。所以无论哪种方式,我都必须进行某种批处理操作。
  • 为了避免“batch-y”操作(通常是 cron 任务,但也有排队任务)的严格期限,请考虑使用手动缩放(或基本缩​​放)将它们分派到模块,请参阅 cloud.google.com/appengine/docs/java/modules

标签: google-app-engine cron google-cloud-datastore task-queue


【解决方案1】:
  1. 您的数据存储操作不应超时。您需要解决这个问题 - 很可能是通过使用游标并为大型查询设置正确的批量大小。

  2. 您可以执行initialization of objects on instance startup - 检查对象是否可用,如果不可用 - 进行计算。

  3. 请记住将计算结果存储在数据存储中(除了 Memcache),因为 Memcache 是易失性的。这样,如果 Memcache 对象因任何原因被删除,您不必在第一次计算完成几秒钟后重新计算所有内容。

  4. 可以安排延迟任务在指定延迟后执行。因此,您可以创建一个要在 1 小时后执行的任务(例如),而不是使用 cron 作业。该任务完成自己的计算后,可以创建另一个任务在一小时后被激发,依此类推。

【讨论】:

  • 感谢回复,问题是我需要建立一个分类器的模型。这不是简单的存储那么简单。即使我确实存储了模型,检索它仍然是一个很大的查询,这会导致问题(主要是超时)。我宁愿计算一次,把它保存在内存中,这样我就可以快速对来自前端的实例进行分类
  • 如果可以存储在 Memcache 中,则可以存储在 Datastore 中。只要您使用游标,即使您检索十亿个实体,任何查询都不应该超时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2013-07-05
相关资源
最近更新 更多