-1

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

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

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

4

2 回答 2

1

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

我认为 GAE 非常适合。

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

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

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

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

于 2012-08-17T09:35:27.207 回答
1

只要您不需要对文章进行全文搜索(目前仍被标记为实验性并且限制为每天约 1000 次查询),您的使用场景听起来就很适合 App Engine。

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

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

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

同样,只要对标签和关键字的搜索不是全文搜索,App Engine 的数据存储区查询就可以有效地处理这类搜索。如果要同时搜索标签和关键字,则需要为这两个字段构建复合索引。这可能会增加您的写入成本

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

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

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

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

于 2012-08-17T11:51:55.913 回答