【问题标题】:Is GAE optimized for database-heavy applications?GAE 是否针对数据库密集型应用程序进行了优化?
【发布时间】:2012-08-17 19:51:55
【问题描述】:

我正在编写一个用途非常有限的 Web 应用程序,它存储大约 10-20k 用户提交的文章(通常为 500-700 字)。在任何时候,任何用户都应该能够对标签和关键字执行搜索,编辑任何文章的任何部分(元数据、文本或标签),或者下载整个数据库的最新副本. (只要每小时更新一次,它就可以来自缓存。)活动往往会在一天内发生一些不可预测的峰值(其中许多用户同时下载整个数据库,需要 100% 的可用性和快速下载)和间歇性的几周活动。这种使用模式是一成不变的。

GAE 是这个应用程序的明智选择吗?它的低成本(希望是免费的)、规模弹性和对大部分堆栈的专业管理对我很有吸引力。我喜欢将应用引擎作为主机替代品的想法。但是,我担心各种数据存储使用方式的过度限制和配额,以及数据存储的分布式架构强加于强一致性和最终一致性之间的权衡。

有没有办法让这个应用程序适应 GAE?我应该使用 ndb API 而不是普通的数据存储 API 吗?还是要求数据如此密集,以至于 GAE 比 Webfaction 之类的主机更昂贵?

【问题讨论】:

    标签: database google-app-engine optimization nosql


    【解决方案1】:

    只要您不需要对文章进行全文搜索(目前仍标记为实验性和limited to ~1000 queries per day),您的使用场景听起来就很适合 App Engine。

    存储大约 10-20k 用户提交的文章(通常 500-700 字)

    App Engine 中的最大实体大小为1 MB,因此只要文章的总大小低于此值,应该没有问题。此外,读取数据的成本与实体的大小无关,而是与正在读取的实体数量有关。

    任何时候,任何用户都应该能够对标签和关键字进行搜索。

    同样,只要标签和关键字的搜索不是全文搜索,App Engine 的datastore queries 就可以有效地处理这类搜索。如果您想同时搜索标签和关键字,则需要为这两个字段构建一个composite index。这可以increase your write cost

    下载最新的整个数据库的副本。

    您可以使用cron/scheduled task 安排每小时转储到 blobstore。如果您的转储需要超过 60 秒才能完成,则 cron 可能会针对后端实例。请记住,每次转储时,您都需要读取数据库中的所有实体,这意味着每小时 10-20k 读取操作。您可以向您的实体添加一个时间戳字段,并让您的转储 servlet 查询比上次转储更新的任何内容,而不是保存读取操作。

    活动往往会在一天内出现一些不可预测的高峰(其中许多用户同时下载整个数据库,需要 100% 的可用性和快速下载)和间歇性的低活动数周。

    这是 GAE 的亮点,在这种情况下,您可以使用 GAE 非常有效地使用实例。

    【讨论】:

      【解决方案2】:

      我不认为您的应用程序特别“依赖数据库”。 500-700 字只是几 KB 的数据。

      我认为 GAE 很适合。

      您可以将每篇文章存储为实体上的文本属性,并在列表属性中使用标签。要搜索文本,您可以使用搜索服务 https://developers.google.com/appengine/docs/python/search/(目前有配额限制)。

      不能 100% 确定是否下载所有数据,但我认为您可以将所有数据存储在 blobstore(可能是 pdf 格式?)中,然后允许用户下载该 blob。

      我会选择 NDB 而不是常规数据存储,主要用于内置异步功能和缓存。

      关于保持低于配额,这取决于访问该网站的人数以及他们下载/上传的数据量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多