【问题标题】:Designing to easily migrate to Google App Engine旨在轻松迁移到 Google App Engine
【发布时间】:2011-01-22 20:46:48
【问题描述】:

我将很快开始设计一个 Web 应用程序,虽然我在 SQL 领域拥有丰富的经验,但我不知道为了迁移到 GAE 需要考虑什么不久的将来。

或者,我可以从一开始就为 GAE 设计应用程序,那么在这种情况下,我需要考虑哪些差异?换句话说,为 GAE 编写应用程序的 DO 和 DONT 是什么,来自过去的关系数据库。

【问题讨论】:

  • 真的需要 GAE 吗?您是否考虑过使用其他 python 框架(pylons?tg2?)性能方面的 GAE 并没有@Tomasz 提到的那么好。

标签: python google-app-engine relational-database web2py non-relational-database


【解决方案1】:

就在我的脑海中:

  • 它实际上只是一个键->值存储,不要被 GQL 之类的东西所迷惑(这只是 SQL SELECT 的一个子集)
  • 没有 JOIN - 通常你必须去规范化或忘记
  • 或多或少的超时
  • (非常)与本地 SQL 库相比访问速度较慢。
  • COUNT 非常昂贵
  • OFFSET(在 SELECT 中)在客户端实现 - 所以实际上你获取所有记录直到 offset - 正如 Nick Johnson 在其中一个 cmets 中指出的那样,它不是客户端,所以现在,作为 LIMIT 1000 没了,类似于 SQL 数据库。
  • (最近删除)LIMIT of 1000 fetched rows
  • SELECT 性能随着返回行数的增加而急剧下降
  • 迁移很难进行,因为您必须使用普通的 http 请求进行迁移,并且每个请求都会在 30 秒后被终止。您必须求助于批量处理行的任务队列
  • 存在伪外键 - 在 Python API 中称为 ReferenceProperties - 但它们不会以任何方式强制执行 - 如果某人/某物删除目标对象,那么您就有了 C++ 中所谓的悬空指针
  • 您用于查询的字段必须被索引,但仍然使用 key(每行/实例的主键排序)可以让您的查询运行得更快
  • 在实时实例上构建索引可能会花费大量时间(而且您无法减少时间),如果没有它们,您的应用程序通常无法运行。强烈推荐啤酒和耐心..
  • 大量人为限制(例如已删除的最大 LIMIT 1000)。例如。 GQL 'IN' 运算符只是多个 OR-s 的语法糖,使用的值上限为 30 个。

这意味着您可能无法避免将不一致的状态暴露给用户,并且几乎可以肯定您无法避免数据的不一致状态(例如,在手动 JOIN 数据更改期间迁移了一半的行,而另一半没有迁移)

【讨论】:

  • 非常非常好的总结了遇到的陷阱。
  • App Engine 数据存储不是“仅”一个键->值存储——它实现了索引。偏移量在客户端实现也是不正确的 - 它由数据存储处理,但数据存储必须读取并跳过适当数量的索引行(就像所有其他 SQL DB 一样,真的)。 IN 的实现也不是“人为限制”。
  • 好的,所以它是带有索引的键->值存储(没有它将无法使用)。重新偏移 - 我的错,直到最近因为1000 limit 出现问题,已更正。 Re IN - 对我来说 30 看起来像是人为的限制(当然我意识到这是因为一些技术权衡)。
  • 因为这是一个非常详细和实用的答案,但过时了 - 我想知道从那以后情况是否发生了巨大变化?是否更好或更容易使用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
相关资源
最近更新 更多