【问题标题】:Passing (large binary) data to appengine task将(大型二进制)数据传递给 appengine 任务
【发布时间】:2011-12-30 07:23:51
【问题描述】:

我有一个任务端点,需要处理从前端请求上传的数据(例如 >1MB 文件)。但是,我认为我不能通过 TaskOptions.Builder 传递来自前端请求的数据,因为我会收到“任务大小太大”错误。

我需要某种“临时”数据存储来存储上传的数据,一旦任务成功处理就可以将其删除。

选项 A:将上传的数据存储在 memcache 中,将密钥传递给任务。这可能会在大多数情况下起作用,除非在处理任务之前驱逐数据。如果能解决这个问题,听起来是个不错的解决方案。

选项 B:将数据存储在数据存储区(为此目的创建的实体)。将 id 传递给任务。任务完成后负责删除实体。

选项 C:使用 Blobstore 服务。恕我直言,这在概念上与选项 B 相似。

目前,我认为选项 B 是最可行的方法。

感谢有关处理这些情况的最佳方法的任何建议。

【问题讨论】:

    标签: google-app-engine


    【解决方案1】:

    如果要存储大于 1mb 的数据,则必须使用 blobstore。 (是的,您可以对数据存储中的数据进行分段,但这并不值得。)但是,有两件事需要注意。确保将数据以小于 1mb 的块写入 blobstore。此外,由于任务队列是幂等的,如果请求的 blobstore 键不存在,您的任务应该不会失败,因为之前的任务可能已经删除了它。

    【讨论】:

    • 当您说“确保将数据以小于 1mb 的块写入 blobstore”时,您的意思是数据存储而不是 blobstore 对吗? ...因为 blobstore 文件大小限制要高得多。选择 C ​​选项。:-)
    • 我想我现在明白你的意思了。您指的是“blobstore”读取 - BlobstoreServiceFactory.getBlobstoreService().fetchData() 大小不能超过 1MB。
    • 不,我指的是写入 blobstore。见:code.google.com/appengine/docs/python/blobstore/…。在 f.write('data') 调用中,您将拥有一个大数组。这个数组必须被分割成小于 1mb 的部分,然后在每个段上调用 ​​f.write()。
    【解决方案2】:

    选项 B 也不起作用,因为最大实体大小也是 1mb。与任务相同的限制。

    选项 A 不能提供任何保证,值可以随时从内存缓存中过期,并且可能在为该值设置的过期期限之前过期。

    恕我直言,选项 C 最适合您的需求

    【讨论】:

    • 感谢 splix 和 @flipps0。你们太棒了。似乎都指向选项C,可惜我只能勾选一个正确答案。新年快乐!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多