2009年上演互联网争霸赛,微软与Google双方的战略意图相当明显。
1. 微软以陆奇为主帅,强攻Google的核心业务,网络搜索。
2. Google砸重金推广云计算,挑战微软的拳头产品,Outlook email系统,和Office产品系列。
攻防战的关键,在于寻找对方的软肋。
[1] Microsoft Outlook vs Google Gmail
Microsoft outlook email系统的软肋,在于它的后台系统不够稳定,容量也不容易扩展。对于用户而言,经常会遇到Outlook服务器联系不上,以及存储空间不够的麻烦。
看准这两点,Google把Gmail系统的号召力定位在,1. 稳定性,2. 无限的存储空间。Google之所以敢于这么叫阵,本钱就在于云计算平台。
当然微软也不会示弱,它们反制的着力点在于保密性。
譬如有一家企业叫foobar,Google的销售人员游说到,“别用Outlook了吧,那玩意儿经常掉线,而且隔三岔五地骚扰你说,存储空间没有了,请立刻删除不必要的emails。你的emails都很重要,怎么能删呢?用我们的gmail吧。”
Foobar公司的IT主管说,“我们公司的邮箱地址是@foobar.com,换成@gmail.com,不仅不方便,而且也有损于我们公司技术实力的形象。”
Google的销售人员说,“不用换邮箱地址,表面上看仍然是@foobar.com,用户也可以继续使用Outlook桌面工具,但是后台服务器被悄悄地换成了Gmail的云计算平台。”
Foobar公司的IT主管心思有点动摇。
这时候,微软的销售人员上门,说到,“听说你们想把email后台系统换成gmail?这可需要一点勇气。你们把公司所以emails,存放在Google的平台上,万一Googler偷窥你们的emails,贵公司的商业机密,。。啊,哈哈。”
所以,为Google进言,欲挑战微软outlook,必先解决gmail的保密性。也就是其它公司的emails虽然存放在Google的云计算平台,但是Google能够提供足够的技术保证,即便是Googler有意偷窥,他们也看不到。
[2] Microsoft Office vs Google Docs
Microsoft office 产品的软肋,在于所有文件存放在电脑本地。
譬如我在办公室写了一个设计草稿,通过email把文本发给一个同事审阅。晚上回家后,查看email,收到同事回复,说他做了一些文字上的改正,修订版本放在email的附件中,同时建议多加几个插图。我加了几个插图后,文件尺寸变得很大,email发了很久,还是没有顺利发出。于是我把文件存在U盘上,第二天上班后,拿给同事看,然后进一步修改。
Google的销售人员游说到,“你这样左一个文本,右一个文本,不仅不容易找,而且修改过的内容很容易遗漏。用Google Docs,就可以省掉所有这些麻烦。文本放在Google云计算平台上,无论你是在办公室里,还是在家里,你都可以对同一份文本进行修改。而且你可以与你的同事共享这个文本,他也可以对同一份文本进行修改。”
我问,“万一我不同意同事的修改怎么办?”
Google的销售人员回答,“没关系,就像wiki一样,所有修改都有记录。如果需要,你可以恢复旧版本。还有,如果你需要查找几年前你写的另一份文件,你不必记住名字,只要一搜索就可以从故纸堆里找出来。”
于是我心旌动摇,准备建议领导把公司的设计文档全部放到Google Docs里去。这时候,微软的销售人员上门了。“听说你要建议把公司所有机密设计文件,转移到Google Docs中去?不怕Googler偷看呀?”
我说,“Google已经提供了解决方案,给我们所有文件加了密,密钥掌握在我们手里。即便Googler想偷看,他们也看不到。”
微软的销售人员说,“这样就好,安全第一。另外,你们的设计文档格式很简单吗?示意图怎么画,Google Docs有类似于微软Visio那样的工具吗?还有,如果你要比较两份不同的文件有什么差异,Google Docs有没有微软Word那样‘比较与合并’ 等等功能?”
微软反制的着力点在于,Google Docs的所有操作都在浏览器里完成,所有功能都通过JavaScript实现。受制于JavaScript的限制,Google Docs在功能上,不仅目前赶不上Microsoft Office,而且预计在相当长的未来,也不可能与之抗衡。
两军对垒,通常双方阵线连绵数十公里。在发动进攻的时候,很少出现全线推进的情况。相反,进攻往往出现在有限几个突击口上。集结强大兵力,在几个突击口上猛烈打击,期望在敌方阵线撕开缺口,然后向敌方纵深挺进,分割敌人阵线,再逐个合围,各个击破。
巴巴罗萨战役 Operation Barbarossa
Courtesy
大公司之间竞争也有类似特点,双方都有很多产品和服务,而且功能类似,这就像战争中两军对峙的阵线。当一个公司向对手发动竞争攻势的时候,往往选择少数几个产品,大做广告和其它市场推销活动,以期迅速扩大在相关市场的占有率。这类似于在战争中,选择突破口,集结兵力,发动冲击,企图撕开敌军阵线。
譬如Google Docs,虽说它上线已有相当时日,但是从没有见到Google大规模宣传这个服务。所以Google Docs与Microsoft Office,是对峙的阵线,而不是发动进攻的突击口。
Google在云计算战役中,选择的突破口是什么产品和服务呢?答案,Google gadgets。
Google gadgets
Courtesy
Google gadgets简化了建网站的工作。每个网页可以视作多个元素集成,譬如上面显示的网页包含6个元素,从左上到右下分别是天气,时钟,日历,YouTube视频,生活小窍门,以及搜索。网页元素,portlet,这个概念早在1999年就已经出现。Google gadgets是portlets的一种实现方式,与其它实现方式相比,Google gadgets的优势是使用方便。
譬如某人想建一个网站,在网站的首页的下方,想插入一个搜索框。他不用担心如何去实现隐藏在页面背后的搜索引擎,他要做的,仅仅是在网页的HTML里,插入几行 JavaScript。这几行JavaScript,不仅在页面上显示了一个搜索框,而且更重要的是把这个网页与Google的云计算平台联系在一起。每当用户输入搜索请求时,这段JavaScript就把用户的请求,转发给Google搜索引擎,然后接收Google搜索到的结果,并显示在网页上。
Google gadgets的意义在于,不再像以往的产品那样,在电脑本地获取服务和内容。Google gadgets的服务和内容,来自于Google云计算平台。譬如以往的时钟,显示的时间是由电脑自己演算出来的。如果系统设置错误,时钟就有可能出错。但是Google gadget的时钟,它的时间不是电脑本地演算的,而是从Google云计算平台索取的。只要Google云计算平台不出错,只要网络链接正常,即便电脑本身的设置出了问题,Google gadget时钟也照样准确。
Google gadgets不仅可以给建网站的人提供便利,基于同样原理,Google又推出了Google desktop gadgets。它给千千万万普通的电脑使用者,带来多样化的,时尚的服务。
Google desktop gadgets
Courtesy http://vishnus.name/blog/files/vishnu_yahoowidgetmemoryuse.jpg
有人说,Google gadgets让电脑弱智。因为一旦Google gadgets大行其道,电脑就无需强大的CPU和存储空间,它所需要的无非是浏览器,接收用户的请求,转发给Google云计算平台,云计算平台提供内容和服务,然后浏览器接收这些来自云计算平台的内容和服务结果,并且把它们显示给用户。
其实,企图让电脑弱智的,不仅仅是Google云 计算,早在1996年,Oracle总裁Larry Ellison就提出过网络电脑(Network computer)的构想。网络电脑的功能,仅限于浏览器,而内容和服务来自于网络服务器端。与Google云计算平台不同的是,Larry的构想是,网络服务器端最好是Oracle的数据库以及Oracle的应用服务器。
十多年过去了,Larry的构想没有成为现实,原因有三,
1. Network computer的卖点是便宜,因为与传统PC相比,NC无需昂贵的CPU,内存和硬盘。但是近十年来,PC的价格迅速下跌,NC的卖点失去了吸引力。
2. Larry Ellison设想的,以Oracle Database为核心的网络服务器,没有提供很好的可扩展性,也没有提供大量的有吸引力的应用。
3. 网络带宽的发展,没有超过PC计算能力的发展。
十年后的今日,以Google云计算平台为代表的网络服务器集群,比Oracle Database有了长足的改进。不仅可扩展性更好,而且Google提供了很多能吸引人的服务,譬如搜索,视频(YouTube),地图等等。
同时,虽然网络带宽的发展没有超越PC计算能力的发展,但是至少在很多地区,网络带宽不再是制约网络服务发展的瓶颈。
Network computer失败的三条原因中,两条发生了变化,所以,Google拾起老概念,换上新包装,向微软发起攻势。其战略目标,无非是弱化PC本地计算能力的重要性,增强对Google云计算平台的依赖性。
下一步Google gadgets的发展方向是什么?
请注意,目前绝大多数gadgets都是单向使用Google云计算平台所提供的内容和服务,而缺少促进用户上传新的内容和新的服务的gadgets。
所以,不妨大胆预测一下,Google下一步将非常热衷推出像论坛(forum),维基网页(wikipage)这样的gadgets。通过它们,促进用户给Google云计算平台上传用户生成的数据。
进一步,Google将投入巨大资源,发展AppEngine。AppEngine的用处是方便用户开发新的服务逻辑,并且在云计算平台上运行这些新的服务。但是AppEngine的开发,势必遇到很多技术上的困难。详细分析,我们留给下一篇来讨论。
【5】是云计算,还是云存储?
Gadgets的目标是方便大家建网站。但是单靠gadgets,建网站的工作还是不够方便。
通常网站有三个组成部分,1. 网页,2. 业务逻辑, 3. 数据存储。如果说网页相当于商店,那么业务逻辑相当于车间,而数据存储相当于仓库。商店,车间和仓库三者中,技术含量最高的,当属车间。
Manufacture in old time
Courtesy
车间管理可以大致概括为两件事,1. 工艺流程,2. 资源调度。工艺流程关心的是,先做什么,后做什么,才能生产一个完整的产品。资源调度的问题是,哪个工人,用哪台机器,在哪个时间,做什么。
网站的业务逻辑处理,大致来说也分业务流程和资源调度两部分。
流程的设计,每个网站不尽相同。譬如有两个网站,一个招聘人才,另一个销售图书,它们的业务流程非常不一样。但是销售图书的网站,与销售电器的网站,它们两者的业务流程相对比较接近。
流程设计千变万化,而资源调度却有章可循。所谓计算机资源,无非是这五种东西,1. CPU,2. RAM,3. Disk,4. RAM-Disk IO,5. Network。资源调度,无非是优化使用这五种资源,使之在最短的时间内,完成分配来的工作。
优化使用这五种资源,目标挺明确,实施起来却相当不容易。一日偶遇一仙人,谈到计算资源调度优化的问题,仙人说,他有一套五行八卦的优化办法,用中国古代智慧,解决当今科技难题。我把仙人的办法概括为以下几个要点,
1. 五行相生相克,系统优化不能偏执单一资源的优化。
2. 系统的总体效率需要一个测度,这个测度被称为“阴阳度”。
3. 阴阳度不是五种资源的简单加权和。阴阳度与五行的关系是非线性的,这种非线性关系可以参照河图洛书来确定,譬如规定五行中土的阴阳度为0,河图数零点的阴阳度为-5,洛书数零点的阴阳度为-10。
4. 时刻监控系统总体的阴阳度,阴阳度变化的正常模式可以分为太极,太虚以及太一三种。
5. 当阴阳度的变化偏离了正常的模式,就需要对系统进行调整。调整的办法参见“说卦”中的六种范式,即洛书逆式,先天八卦,后天八卦,神也者,洛书顺式,和乾坤六子。
仙人的办法听上去很有美感,但是操作起来却有难度。正在困惑之时,听到Google宣布,“我有办法解决资源调度问题,你们只须专注于业务流程”,确实为之感召。
Google的解决办法,是AppEngine。
Google AppEngine logo
Courtesy
问题是,Google AppEngine真得能够优化任何业务流程的资源调度吗?
譬如有人想建一个人才招聘网站,招聘的业务流程如下图所示。Google打算劝说这个人把网站建在Google云计算平台上,做为技术支持,AppEngine应该提供哪些功能?
Recruiting process business logic
Courtesy
猛一看,觉得很容易,流程清楚,算法简单。只需要把流程中诸多环节,归并成几个模块,即大功告成。
再看看,事情没那么简单。整个流程不是从头到尾一次走完,譬如interview会有好几次,然后过几天才会发offer。所以,应当把整个流程的每个模块独立出来,封装成服务,每个服务能够独立运行。召之即来,来之能战。平时不用,不占资源。
SOA(Service Oriented Architecture)还有一个好处,是便于重组业务流程。譬如系统上线以后,发现在面试(interview)以前,还需要添加一个电话约谈(phone screen)的环节。如果流程中每个服务都能独立运行,添加新的服务就很容易,不至于造成牵一发动全身的局面。
SOA的结构设计,有很多优点,但是仍然有遗留问题。如果同时有很多人使用这个招聘网,系统的吞吐量需要随之加大,怎么办?增加系统吞吐量的办法,有两条思路。
第一种办法是购置多台机器,每台机器上安装所有服务。当很多人同时使用招聘网的时候,把他们的需求均匀转发到各个机器上去,这样每台机器的负载都不大,但是整个系统的吞吐量增加。
第二种办法的效率更高,它可以用数量较少的机器,达到和第一种办法相同的吞吐量。或者,用相同数量的机器,在更短的时间内完成所有任务。这种办法首先分析每个服务耗费的资源,譬如CPU时间和RAM空间等等。然后给资源耗费量大的服务多分配几台机器,以免它们成为整个业务流程的瓶颈。
第二种办法虽然有很多好处,但是实现起来有些难处。首先是如何监控和分析每个服务的资源消耗,其次是如何自动把服务从一台机器转移到另一台机器去运行。
或许有人会问,为什么不提多线程的办法呢?所谓多线程是把多个任务交给多个线程去完成,这些线程交叉使用CPU,IO,Disk等等资源,减少使用这些资源前的排队时间。多线程的办法,关注的是每个服务的实现细节。而我们刚才讨论的,是服务与服务之间怎么整合的问题,所以,是不同层面的问题。
又有人问,为什么不提MapReduce之类并行处理的办法?与多线程一样,MapReduce关注的是每个服务的实现细节,是不同层面的问题。
回到前面的问题,如果Google打算劝说大家把网站建在Google云计算平台上,做为技术支持,AppEngine应该提供哪些功能?
1. 开放更底层的APIs,而不仅仅是Python的APIs。便于第三方开发人员,实现逻辑复杂,以及资源使用方式复杂的模块。
2. 提供IDE,方便第三方开发人员,把模块封装成符合Google云计算平台规范的服务。
3. 开发调度工具,用于监督各个服务资源消耗,分配合适的机器去负责各个服务运行等等。
4. 开发预警和修复工具。开放自己的平台,去运行第三方人员(外人)开发的服务。对于Google来讲,有理由提高戒备,预防云计算平台崩溃,万一崩溃了,能够迅速修复。
这四个功能,AppEngine目前都没有实现,所以云计算平台,对于第三方开发人员来说,暂时不是计算平台,而是存储平台。
【6】安全性的难题,有解还是无解?
对于Google来说,如果希望AppEngine能够获得商业上的巨大成功,吸引更多用户,尤其是企业用户,最大的挑战在于,如何保障客户的数据和私有程序的安全。
举个例子,譬如Google想劝说某家银行,用不着银行自己建数据中心,把银行的数据存到Google的云计算平台,每月给Google一笔数据托管费即可。银行很可能会问两个问题,
1. 如何防范Google员工偷窥银行的数据?
2. 银行有投资业务,所以银行自己开发了一套软件,用于评估投资风险和收益。如何防范Google员工偷窥这些软件的代码?
Google当然会派律师去游说,指天画地地发毒誓,说如果出现Google偷窥数据及代码的情况,根据双方合同,Google必将受到法律严惩,等等。
但是银行还是不放心,作案取证本来就麻烦,如果Google再做点手脚遮掩,很可能查无实据。即便能找到实据,一个案子办下来,时间也得拖很长。
这个问题,困扰的不是Google一家,而是所有负责数据托管的公司面临的共同问题。所以,现在只有两类公司,敢把数据托管给他人。一种是中小企业,他们或许会觉得自己在竞争对手眼里不那么重要,对手不至于甘冒风险去刺探自己的机密。另一种是数据本身机密性不高的公司,譬如新浪网,天涯社区等等,他们的数据内容本来就是公开的。
所以,如果Google打算吸引重量级企业用户来使用云计算平台,最好的办法是从技术上想出路,保证做到,即便Google挖空心思想偷窥,也看不到。
1. 有人问,为何不用VPN技术呢?
VPN(Virtual Private Network)虚拟私网,解决的是在如何通过公共网络,远程访问企业内部私网的问题,譬如在家处理公司业务,需要把自家的电脑,通过公共网络,接入到公司内部网络中去。所以,VPN解决的问题主要在于,保证家里电脑和公司电脑传输数据时,数据通过公网时的安全。
经常在北京街头看到振远护卫的押运车,以及持枪的押运员,负责运输现钞,有人戏称他们是振远镖局。镖局的任务之一是,把现钞从银行押运到各个ATM自动取钱机,中途通过公共马路。现钞安全到达目的地,镖局的任务圆满完成。但是,如果有谁把ATM取钱机撬开了,镖局不负责任。
类似的道理,客户可以通过VPN把数据安全地传输到Google云计算平台,但是VPN不能阻止Google的内部员工偷窥存放在Google机器上的数据。
振远护卫在奥运会期间负责押运运动员尿样
Courtesy
2. 还有人建议,可以给数据加密。
客 户在上传数据到Google云计算平台前,先用私钥(private key)给数据加密,这样存储在Google云计算平台的数据,是加了密的数据。Google员工即便打开了文件,看到的也不过是一堆乱码。当客户授权给他的同事看数据时,给同事一份公钥(public key)。同事用这个公钥解码,然后就能读到真实的内容了。
德国人的钥匙很有意思,办公室的钥匙,同时可以打开大楼的门,以及公司的门,但是不能打开隔壁办公室的门。隔壁办公室的钥匙,也可以打开大楼的门,以及公司的门。所以,德国人的钥匙和锁,是有层次的。
公钥也可以这么设计,一个部门的公钥,不仅可以解密本部门的文件,而且可以解密公司内部公开的文件,但是不能解密其它部门的文件。实现这样有层次的公钥并不难,一个简单的办法是把整个公钥分成几段,第一段负责公司内部公开的文件,第二段负责某特定部门的文件等等。
这个办法猛一听起来似乎可行,但是仔细想想却不然。它有四个缺陷,a. 不能给程序加密,b. 不能搜索加了密的数据,c. 不能给数据库文件加密,d. 公司员工离职后,有可能会造成私钥和公钥的外泄。
3. 程序如何加密。
按照前一段的思路,平时给程序加密,只有当运行程序前,才解密。程序运行结束后,再度加密,同时销毁解密了的程序。但是这个办法不可行。
解密和加密,是相当耗用CPU的,同时占用时间也比较长。如果实施平时加密,用时解密的措施,用户等待时间会相当长。更严重的是,通常一段程序不能解决所有问题,一段程序往往会调用其它程序,其它程序又调用另外程序。如果平时把所有程序加密,用时再逐个解密,整个流程将占用很长时间,这将严重影响用户的体验。
现实中通行的办法是给程序变形,学名叫Obfuscation。道理很简单,把程序中的变量名称转换掉,同时切割整个程序,并且重新排序,以便混淆耳目。变了型的程序依然可以运行。
正常的编译过程,是把人类可读的源代码(譬如用Java写的程序),翻译成机器代码(譬如Java bytecode)。而反编译是把机器代码,逆向翻译成人类可读的源代码。虽然Obfuscation不能从根本上阻止反编译,但是却增加了这个工作的难度。
虽然有难度,但是重赏之下必有勇夫。譬如,如果能盗窃银行密码,肯定会有人不辞劳苦地反编译。
4. 加密与搜索。
“Greatness is never a given, it must be earned”,这句话怎么翻译?在Google或者百度里搜一搜这句话,一定会发现这是奥巴马总统就职演说中的一句。有人翻译成,“伟大不是凭空而来的,而是赢得的”。意思当然不错,但是觉得不如原句有气势,不如翻译成,“坐等等不来伟大,伟大必定来自于努力”。
Google和百度是如何搜索到这话出自奥巴马的演讲呢?道理说穿了并不复杂。
首先,Google和百度建一个索引,学名叫倒排索引(inverted index)。倒排索引中记录了每个单词出现在哪些文章中,而且记录了在这些文章中的什么位置出现过。
其 次,当用户搜索“Greatness is never a given”,搜索引擎通过倒排索引,查找“greatness”在哪些文章中出现过,查找“never”在哪些文章中出现过,等等。然后把众多的搜索结果合并起来,看看哪些文章中不仅出现过“greatness”,还出现过“never”,“given”等等。
如果把奥巴马原文加了密,不仅每个词都变成了乱码,而且词与词之间的空格消失了,甚至连词序也可能被打乱。这样一来,就没有办法按照通常的做法构建倒排索引。
怎么办?思路有三条。
a. 把加密算法和构建倒排索引的算法通盘考虑,重新设计一套一体化的算法。
这个思路能够一揽子解决我们面临的所有问题,但是设计这套算法的难度很高。目前还没有人能够想出有效的算法。
b. 客户自己动手建倒排索引,然后把索引加密,上传到云计算平台。
但是构建倒排索引是一件计算量很大的工作,如果客户能够自己构建倒排索引,那么就没有必要使用云计算平台。理由是,云计算平台的卖点是方便客户处理繁重的数据计算。如果云计算平台不能帮助客户构建他们专用的倒排索引,那么云计算的卖点就大大失色。
更严重的问题是,在使用索引的时候,必须先解密。如果解密了的索引被Google员工偷看了,那么加密就失去意义了。原因是,索引中透露了正文中出现过那些词,以及这些词出现的位置。通过索引中的这些信息,可以复制原文的。即便不能一字不漏的全文复制,也能复制得八九不离十。
所以,这个思路不可行。
c. 在云计算平台中分离出一部份作为密室,专供企业用户存放保密级别很高的数据,以及运行保密级别很高的程序。
信息安全的法则是分离分离再分离。给每个企业用户分配一部份机器作为密室。这些机器的Root权限掌握在企业用户手里。Google的员工只能监控密室中的机器的CPU,RAM和IO的使用情况,但是他们没有权限进入机器,查看文件,运行程序。
这个办法虽然技术含量不高,但是比较容易实现。缺点是容易造成资源浪费。因为如果给每个客户单独开密室,即使密室里的机器空闲,别人也没法用。
5. 加密与数据库。
数据库最多只能对字段逐个加密,譬如“greatness”变成“@#¥%”。但是不能整句整段地加密,否则数据库的索引,B+ tree,就没法构建。
所以,对数据库的系统管理员,无法实施高级别的加密。
6. 私钥和公钥的外泄。
公司员工离职后,很可能复制一份公司的公钥和在职期间自己使用的私钥带走。如果沿用前面所述,用私钥加密,用公钥解密的办法,员工离开公司后,仍然能阅读公司的文件,甚至篡改当年自己在职期间起草的文件。
所以,最妥善的办法是不让员工直接接触公司密钥。从这个原则出发,作者也好,读者也好,都没有密钥。作者要加密,读者要解密,让他们把文件发给密钥中心,由密钥中心统一负责加密和解密。
另外,即便由密钥中心负责保管密钥,如果长期使用同一套密钥,还是不安全。所以,密钥中心定期更换密钥,分批给文件重新加密。
这个办法可行,但是比较笨拙,因为,a. 密钥中心成为瓶颈,b. 给旧文件重新加密是负担很重的工作。
Durer's grid
Courtesy http://employees.oneonta.edu/farberas/arth/Images/ARTH_214images/Durer/durer_perspnude_large.jpg
为Google计,目前能做的,似乎是明确云计算的定位。
1. 锁定目标客户,这些客户有一个共性,就是对内容和程序的安全性不敏感。
比如各种门户网站,论坛,B2C网上商店,政务和各种公共事业的网站,以及中小型企业等等。这部分用户数量不少,市场相当广阔。
2. 提供特色服务,尤其是海量数据处理。
云计算平台类似于巨型计算机。客户利用云计算平台,处理自己的计算中心很难完成的海量数据处理。例如:电脑动画制作,天气预报等等。
3. 根据不同的保密等级,做分级处理。
实际上一个企业的重要秘密信息是不多的,机密文件存放在企业自己的机房里。其它不需要保密的文件,托管到云计算平台。这个市场也是很大的。