使用GAE的一些感受
最近个人的一个小项目部署在GAE上,项目写了也有一个多月,所以这篇文章就主要说说这一个多月来使用GAE的一些感受,也算是给想选择使用GAE的同学一些建议把。
其实GAE一点都不是什么新奇的东西,推出也有好几年了,不过由于众所周知的原因,国内访问不是很顺畅,appspot.com更是断得彻底,所以很多程序猿都不是很了解。其实,GAE就是云计算当中一个重要分支PaaS(平台即服务)的重要代表,你只需按照GAE提供的一系列API写好应用,upload上去,就可以访问了,服务器的事情都可以交给Google来处理,包括云的弹性和数据的存储等等。而Google方面也提供用户一些基础的配额,在这些配额之下,用户是无需任何花费的,不过如果应用如果需要更多的资源,那就需要付费了,好的地方是,你的应用瓶颈在哪里,你就可以只为那部分付费,这看起来确实节约了开销。
GAE访问不畅,国内类似的产品倒不少,比较知名的就是新浪的SAE和百度的BAE,这俩从名字上就明白了。SAE和GAE很类似,BAE看起来也差不多,不过,现在还在邀请使用的阶段,而我也没能拿到邀请码,所以哪位同学有多余的,可以分享给我一份,不胜感激:)
话休絮烦。使用下来的体会主要有以下几点:
使用GAE就意味着你的应用被限定在它的框架中,这是一把双刃剑。好处主要是方便,操作数据库可以使用datastore API而无需自己配置数据库;taskqueue也直接有API使用,异步的任务队列很轻松就搞定,而无需使用诸如Celery+RabbitMQ的解决方案;Channel API提供了类似客户端和服务器长连接的技术,它复用了GTalk的组件,会适配浏览器而选择使用WebSocket抑或是长轮询,你无需去了解它们的细节。这些当然只是例子,还有诸如cron job等等,它极大得简化了开发人员的工作,而不是让程序猿们花大量时间在配置上。
坏处也就是显而易见的了,由于大量使用GAE提供的接口,应用的可移植性就变得很差,如果一旦由于各种原因放弃使用GAE,整个程序面临着重写,当然将问题减少到最小的方法是使用适配器模式来做一层封装,不过还是有较大的工作量。
第二就是关于配额的的问题。其实在GAE部署应用了之后才能深刻体会到配额的数量真的不多,所以不可避免的做法就是在应用里处处精打细算,至少不能浪费。
首先是datastore的配额问题。在其免费配额中关于读操作有两项:“Datastore Read Operations”和:“Datastore Small Operations”,他们都有5万次/天的配额,不过千万别觉得Google慷慨,这个其实是很不经用的。不过相信很多人不明白什么是read和small,这里就先简单做个介绍。
对于datastore,每个要存储的model实体(相当于关系数据库中的行),都有个必有的key和可选的parent属性,通过它们就可以找到一个model实体,而parent是极其重要的,如果应用中用到了事务,不论是否跨model,只有拥有相同的祖先(ancestor)才可以完成一次事务。对于譬如一次查询操作,我们查询到了十个结果并返回这些model实体,那么我们就使用了11次read操作;更极端的是,如果查询的时候使用了offset,就是跳过了offset个结果,这些要是要算入到read操作中的,所以比如说取跳过50个的10个结果,这实际上就是61次read操作,所以开销是极大的。解决方法就是使用游标(cursor),每次查询的时候拿到上次查询的游标,从游标开始取10个,这样就还是11次操作。
那么什么是small操作呢,刚刚提到了model的key属性,我们通过key得到一个model实体,这就是1次small操作;还有就是count操作,比如说我们得到结果是100,那么就是1次的read操作+100次的small操作,因为计算数量不需要取到数据,只需要知道key就可以了。而我们查询结果的时候,可以只查询得到key,再通过key去得到model实体,这样就减少了read操作,但也相应增大了small操作。不过无论如何,都要记住游标是很重要的东西,它其实只是一个很长的字符串,所以在网页应用中,我们可以渲染到页面中,然后在之后的查询时,作为参数传递。
使用游标确实能减少配额,不过不能一劳永逸,那么怎么办呢?相信很多同学都想到了,当然是使用缓存(memcache)。因此可以说缓存在GAE中非常重要,因为缓存和配额没有关系,它的使用仅仅和内存的大小有关,所以几乎所有常用的数据都要放到缓存中,缓存的类型也可以包括model实体和页面等等的缓存。所以我们可以用工厂模式来操作数据库的增删查改,每个操作都和缓存结合起来。
关于配额还有一点就是Channel API,它的使用需要在用户访问时创建一个channel,而这个channel 2个小时就会失效。由于每天创建channel的个数为100,如果每次用户访问都需要创建channel,开销太大了,所以,我的做法还是将这个用户的channel缓存,并设置2个小时的失效时间。
好了,关于GAE使用的感受和心得,暂时就总结到这里。如果想到其他的,我会进行补充,以后也会对一些细节做一些分享。
之前也有用过 GAE 做个小项目,最大的烦恼是 DB 操作配额问题,再者需要学习新的 api + 部署成本,我反而更倾向于使用 AWS 这样的平台服务
对的,要考虑的事情其实一点也不少,不过,AWS和它各有各的好,其实将来的事说不准
居然是 Django 写的博客,赞一个
我说学习那么式模式干嘛呢?原来这也是一种原因啊,什么工厂和三层,嗯,有种豁然开朗的感觉,呵呵
给作者留言
关于作者
残阳似血(@秦续业),程序猿一枚,把梦想揣进口袋的挨踢工作者。现加入阿里云,研究僧毕业于上海交通大学软件学院ADC实验室。熟悉分布式数据分析(DataFrame并行化框架)、基于图模型的分布式数据库和并行计算、Dpark/Spark以及Python web开发(Django、tornado)等。
博客分类
搜索
点击排行
标签云
扫描访问
主题
残阳似血的微博
登录