俺炒作Gae已经很长时间的,却纠缠于细节,没有能很好的研究。自从eclipse之后我就对“云”耿耿于怀,遂看了一些资料。写个总结帖子。
云计算是什么,我又该重点炒作哪些内容?
记得院杯初赛的时候,郑淘同志向我逼问“云计算是个啥子嘛”,我回答到了“分布式”之后便无言以对,他便说“漂移”是云的精妙所在,我豁然没开朗。一万个听众心中,有一万个春哥。云计算知识用来被炒作的寂寞罢了。目前有两类很主流的云计算服务。
- 一类是 Amazon S3(提供云存储),Amazon ec2(提供云计算服务)。S3用分布式文件系统实现,ec2则是用类似Xen的虚拟化来提供可伸缩的计算服务。两者商业应用很成功。
- 另一种是Gae,同时提供 云存储和云计算服务。不同于前者,他使用MapReduce算法来提供可伸缩性。MapReduce算法说白了,在带宽比计算能力值钱,就是把任务切割为几块,到各自的机器上去跑,在合并起来。 与普通分布式不同的是每台机器上都有“数据库”,而不是普通系统中的只有专门的数据库服务器。Google其实拥有大量的底配置机器(和我们的PC差不多),和少量大机器完成管理工作,提供了无与伦比的计算能力。但Gae商业应用目前很不成功。原因在于Gae程序的迁移问题(其实也有方案的,下面会介绍),更多人愿意选择Amazon。
唠唠叨叨了半天,大概解释如下:云计算提供一个分布式的存储系统(Amazon S3 or BigTable),还有“云的运算”这不是重点。因为计算能力是最不值钱的。换句话说云计算相对于分布式,和春哥相对于李宇春一样。都是前者更为“性感”一些。而我就是要炒作“纯爷们”这个特点,并告诉大家信他得永生。也可以说云计算是把分布式推向大众的一个口号罢了。详细一点,我的炒点是 如何使程序适应云计算的环境。
如何让程序适应Gae?
不管是Gae还是Amazon都提供了一套API。你甚至能把普通的程序完全迁移过去,为什么要适应?
颠覆的数据库理论。什么一二三范式,什么数据库的良好实践,什么XXX。在这么都没应用无效。我们要换一种眼光来看待。这个要谈谈GaeVfs说起,这个是分布式文件系统,你可以大概理解为索引放在一台机器上,数据分散着。计算要跟着数据跑,所以数据表的粒度要大,一次要能取出全部数据,不要怕冗余,冗余是应该的。比方说,我建个人人网,我把某个人的全部数据包括日志啥的建成一个表,新鲜事也建成一个表,用户刷主页和新鲜事都只要刷一次表,速度极快。这才是我认为的最佳实践。有些人(大概就是作这个的工程师)总结的一下使用BigTable的要点,罗列如下。
- 假定数据访问是较慢的随机访问而非较快的连续访问。
- 为并发读取对数据进行分组
- 磁盘和CPU都很便宜,不要再为它们操心,尽力提高可伸缩性吧
- 围绕数据的用途来决定数据的结构
- 创建大型的实体,允许可选的字段
- 在模型中定义Schema
- 用Ajax隐藏更新操作。
- Put是昂贵的
- 按显式费用模型设计
- 将many-to-many关系包含到实体中,但减少关联元素的数量
- 避免无限制条件的查询
- 避免出现对数据存储实体的争用
- 避免庞大的实体组
数据库设计完了,那么其他可以用领域模型设计,注意粒度放细便于Gae切割任务。
还有一点,很重要,缓存。是的,分布式缓存。很明确,Gae使用Memcached接口来缓存。缓存实现原理应该和GaeVfs差不多。注意点也差不多。Restful应用对于缓存来说是个不错的实践。
其他相关项目
Hadoop,可以理解为Gae的一个Apache的实现,可以跑在普通机器上。跑在Amazon上可以实现类似Gae的效果。
Gaeo是前朝人的项目,想法和我们的GaeS如出一辙,只是他的语言的Python,我们是Java,相信我们可以借鉴不少东西。