`
neeleon
  • 浏览: 181697 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Google GAE Datastore

阅读更多

GAE Datastore是Google App Engine提供的(半)结构化数据存储系统,基于Google大名鼎鼎的Bigtable技术构建。

一、数据模型

GAE Datastore的数据模型与关系模型有很大的相似性,但是无模式的。GAE Datastore的接口主要是ORM风格的,一个类,称为kind,与关系数据库中的表类似。一个kind中的数据为多个entity,每个 entity有唯一的key标识。每个entity可有多个property,一个property可用多个value。这与关系模型有类似的地方,但 GAE Datastore中属于同一个model的不同entity可以拥有完成不同的property,不同entity的同一个property的 value的类型也可以不一样。因此GAE Datastore的数据模型更为灵活。

多个entity可组成entity group,一个entity group实际上是以一个entity为根,通过父子关系(在创建entity时指定父亲)构成的子树。这一模型类似于关系模型之前的层次数据库,自然也 拥有与层次数据库类似的局限,如很多模型就很难自然的用这种层次模型建模,如学生选课系统Student-Course-Elect,谁是谁的父亲呢。 entity group主要用于事务,后面会讲到。

二、查询与索引

GAE Datastore提供类似于SQL的GQL查询,从SQL的观点看,GQL的限制是只有单表查询,有WHERE、ORDER BY和LIMIT/OFFSET,但没有GROUP BY、HAVING、聚集函数等功能,也不支持子查询。WHERE条件可以是基本的"property op value"条件通过and/or任意组合,ORDER BY可指定多个属性。但条件的复杂度有一定限制:

1、如IN (list)条件中list最多只能有30个元素;

2、不等条件只能针对一个属性指定;

3、不等条件属性必须出现到 ORDER BY的最前;

这些限制,据估计应该是为了实现方便和保证性能,如不等条件属性在ORDER BY的最前这一限制使得系统可以方便的通过索引扫描直接输出有序的结果,不需要再来排序。

更新的形式相比SQL有很大的限制。 UPDATE通过put接口实现,给的参数是一个完整的entity,似乎不能像SQL一样只更新某些属性,为了更新一个属性,似乎需要先取出整个 entity(系统可能用lazy load技术,没有用到的属性不会取)。删除时只能指定一个key列表,在关系数据库中的一条DELETE语句要分成两步,先通过查询得到要删除的 entity的key,然后再来删除。并且一次操作中删除的entity个数不能超过500。

默认情况下GAE Datastore会建立一些基本的索引,根据文档的描述,我推测GAE应默认为每个属性建了一个索引,并且索引中都包含key (类似于InnoDB中的二级索引中都包含主键)。应用也可以在在配置文件中定义索引,指定索引包含的属性及排序方向。索引的排序方向必须与查询中 ORDER BY的方向一致,也就是索引只能正向,不能反向扫描,我不清楚造成这一奇怪限制的原因是什么。

如果一个查询没有合适的索引, 则不允许执行,也就是像关系数据库一样的表扫描是不行的。

三、事务

不使用事务时,对 每个entity的写操作是原子的。

系统使用乐观的并发控制,其特征是在有并发冲突时,不等待,而是让操作回滚失败。这保证了操作的响应 时间,但可能导致由于无法立即完成而失败的操作增多,这就好比基于锁的数据结构会被阻塞,无锁数据结构则可能需要不断的进行CAS循环。系统提供自动的重 试机制缓解这一问题。

在同一个entity group中的多个entity操作可组合成一个事务,事务的ACID性质有保障。GAE Datastore应该是通过多版本的技术实现的,因此事务能够获得事务开始时的一致快照,奇怪的是事务本身的更新也看不到。

对不同 entity group的操作是无法组合事务的,而entity group必须通过entity间的父子关系才能组织赶来。这使得GAE Datastore的事务会受一些限制,比如经典的银行转账问题是搞不定的,两个银行账户,谁是谁的父亲呢。理论上用一个伪的根entity把所有 entity组成一个entity group,可以解决这一问题,但这会影响性能。因此只所以限制事务只能在一个entity group内,是因为系统在决定entity存储位置时,会将同一entity group存在在一台机器上,如果把所有entity都纳到一个group,系统就无法分布与伸缩。

有一个细节问题是事务的提交分两步进 行:更新entity和更新索引。因此可能出现根据key找到的是更新后的entity,但根据索引找不到。

四、限制

GAE Datastore的数据或操作有很多限制,比如entity最大1M,一次删除的entity最多500个,查询最多返回1000个结果等。这些限制可 能会给应用开发带来不便。对于查询最多返回1000个结果这个限制,准确的说是limit + offset不能超过1000,即如果你指定了offset是200,那最多只能返回800个结果了。

五、评价
 
系 统性能的两大要素是Scalabity和Efficiency。Scalable的系统不一定Efficient,Efficient的系统也不一定 Scalable。对于海量数据存储系统来说,Scalable是必须的,是行与不行的问题,但Efficient也是非常重要的,是省与不省的问题。

GAE Datastore的Scalabity我估计是不错的,但我不清楚有什么具体的证据表明其Scalabity到底怎么样。GAE Datastore的数据分布对应用来说是透明的,应用不能指定根据某属性的值进行哈希分区之类的显式数据分布策略,这使得精准的查询路由难以实 现,Bigtable论文中说的bloom filer的效果是值得怀疑的。如果实现不了精准的查询路由,很多查询都要访问大量存储节点的话,就会影响到Scalabity。 虽然Google内部很多产品也用用GAE Datastore,但我们知道Google是买服务器不眨眼的,不好比。

但其 Efficiency怎么样,我持很大的怀疑态度。无模式将使得系统不能进行很多优化,底层基于GFS,通过冗余保证可靠性等都可能会影响到系统效率。有 人反映Amazon SimpleDB不快,最简单的查询的响应时间也超过100ms,不知道类似的GAE Datastore会怎么样。

功 能上,最大的优势是无模式带来的好处,即应用升级时不需要像数据库那样做非常耗时的增加/删除字段操作了。但这是一把双刃剑,也可能会带来混乱。打个比 方,这就类似于静态类型与动态类型编程语句的区别。

其次,是ORM风格的接口带来的开发便利,不需要像JDBC编程那样写很多SQL语 句。

与数据库相比,GAE Datastore的功能局限性也是明显的,主要体现在查询处理和事务处理两个方面。查询处理方面,查询只能是单表,没有GROUP BY和聚集函数,查询的条件复杂度和查询返回的记录数都存在限制;DELETE不能指定WHERE,只能指定key的列表等。对事务的支持是受限的,只能 在entity group中进行。这些局限,给应用开发会带来多大的困难,我不清楚。我想,只有将我们的常见的应用如用户与好友关系、日志、相册、消息等,用关系数据库 和GAE Datastore对照着实现一遍,那么哪个系统好用,哪个不好用才能一清二楚。

分享到:
评论

相关推荐

    上传 文件到Google app engine datastore的Demo

    GAE提供了处理文件上传的机制,包括临时存储上传的文件,然后将其保存到Datastore或Google Cloud Storage。 4. **源码分析**:在gae_upload_demo压缩包中的源代码,可能包含了一个简单的HTTP服务器端点,用于接收...

    gaedo-google-datastore-0.6.2.zip

    标题中的"gaedo-google-datastore-0.6.2.zip"指的是一个名为Gaedo的开源项目,它与Google Datastore服务有关,并且是版本0.6.2的压缩包。Gaedo可能是Google App Engine Datastore的一个封装或扩展,用于帮助开发者在...

    gae-datastore-migrator:用于将 Google App Engine 数据存储实体导出到 CSV 文件以及使用 Java Persistence API 参考模型导入它们的实用程序类

    `gae-datastore-migrator` 是一个专门为 Google App Engine (GAE) 设计的工具,它的主要功能是帮助用户将 GAE 的数据存储(Datastore)中的实体转换为 CSV 文件格式,同时也支持从这些 CSV 文件中重新导入数据到 ...

    spring+gae

    2. **数据存储**:Spring与GAE的数据存储API(如JDO或JPA)结合,可以提供一个统一的数据访问层,简化对Google Datastore的操作。 3. **调度任务**:Spring的TaskExecution和TaskScheduler模块可以与GAE的后台任务...

    EGL扩展GAE示例代码

    EGL扩展Google App Engine(GAE)项目示例代码提供了如何在GAE平台上利用EGL进行开发的具体实例。这个项目的核心是通过EGL对Google App Engine的服务进行集成,包括数据存储、任务队列、用户认证等,以创建高效、可...

    GAE blog安装

    实现这些功能需要数据库支持,GAE提供了Google Cloud Datastore作为默认的NoSQL数据库。 7. **测试与调试**:部署后,需要在GAE环境中进行测试,确认所有功能正常工作。GAE提供了日志查看器和性能监控工具,帮助...

    使用 Bigtable、Blobstore 和 Google Storage 实现 GAE 存储.doc

    总结来说,GAE提供了适应不同存储需求的工具,从结构化的数据存储(Bigtable/Datastore)到大型二进制对象(Blobstore)再到独立的对象存储(Google Storage)。了解并熟练掌握这些工具,将帮助开发者构建高效、可...

    关于GAE的教程、工具与文档(建站)

    3. **数据存储**:GAE提供了NoSQL数据库服务,称为**Datastore**。它是一种非关系型分布式数据库,支持高可用性和可扩展性。了解其数据模型(实体、键、属性)和查询语言(GQL或通过API)是至关重要的。 4. **服务...

    Struts2,Spring,JDO,AJAX on GAE

    这篇博客“Struts2,Spring,JDO,AJAX on GAE”可能探讨了如何在Google App Engine (GAE)平台上整合这些技术来构建高效且可扩展的Web应用。 1. Struts2:Struts2是一个基于MVC(Model-View-Controller)设计模式的...

    spring+gae+hibernate

    标题“spring+gae+hibernate”所提及的是一个技术集成项目,主要涉及Spring框架、Google App Engine(GAE)和Hibernate三个关键组件。让我们详细探讨这三个技术以及它们的集成。 Spring是一个开源的Java企业级应用...

    objectify:最简单便捷的Google Cloud Datastore界面

    客观化 ... Objectify v6 +使用Cloud Datastore API ,可以在任何地方使用-GAE Standard,GAE Flex,GCE或完全在Google Cloud外部使用。 有关更多信息,请参见 。 特征 通过Objectify,您可以保留,

    gae-django-cms-v1.2.3_cn.zip

    在GAE上运行Django应用需要对GAE的开发环境和限制有深入理解,例如内存限制、数据存储机制(如Google Cloud Datastore而非传统的SQL数据库)、以及异步任务处理等。 gae-django-cms是针对GAE特性定制的CMS,它可能...

    spring3+springmvc+jpa2+gae

    标题 "spring3+springmvc+jpa2+gae" 指的是一个集成开发环境,它结合了Spring框架的三个核心组件以及Google App Engine (GAE)。这个项目旨在展示如何在GAE上运行一个基于Spring 3、Spring MVC和JPA 2.0的应用程序。...

    可以放到GAE上的blog -- micolog

    - **数据库选择**:Micolog可能需要与GAE的数据存储服务集成,如Google Cloud Datastore,这可能与传统的数据库操作有所不同。 - **持续更新**:使用预发布版本可能需要关注官方的更新动态,及时升级到稳定版本以...

    基于Google.App.Engine(GAE)的Java和GWT应用开发.pdf

    中文名: 基于Google App Engine(GAE)的Java和GWT应用开发 原名: Google App Engine Java and GWT Application Development 作者: Daniel Guermeur, Amy Unruh 资源格式: PDF 版本: 文字版 出版社: Packt ...

    GAE入门教程.pdf

    - GAE 使用自己的数据存储系统,称为 Datastore,提供了 NoSQL 数据模型。 - 查询语言 GQL 类似于 SQL,用于检索和操作数据。 8. **使用模板文件** - Django 模板引擎可以用于创建动态网页,实现数据和页面结构...

    GAE入门教程.docx

    GAE 提供了自己的数据存储系统,称为 Datastore,它是一种非关系型数据库。开发者需要学习 Google 数据模型和查询语言 GQL,以有效地存储和检索数据。 8. **使用模板文件**: 为了将数据和页面呈现分离,教程会...

    Surgo-django-on-gae

    3. **数据库集成**:GAE 提供了自己的数据存储服务(如 Datastore),与 Django 默认的 SQLite 或 PostgreSQL 不同。因此,你需要配置 Django 使用 GAE 的适配器,如 `googlecloudsql` 或 `gae-db`,并调整模型以...

    如何在GAE中轻松使用Django框架

    标题中的“如何在GAE中轻松使用Django框架”表明我们即将探讨的是如何在Google App Engine (GAE) 平台上有效地部署和运行Django Web应用程序。Django是一个流行的Python Web框架,它提供了诸如数据库管理、用户认证...

Global site tag (gtag.js) - Google Analytics