Tag Archives: Google

探索Google App Engine背后的奥秘(2)–Google的整体架构猜想

按:此为客座博文系列。投稿人吴朱华曾在IBM中国研究院从事与云计算相关的研究,现在正致力于研究云计算技术。

本文是基于现有的公开资料和个人的经验来对Google的整体架构进行总结和猜想。

在软件工程界,大家有一个共识,那就是”需求决定架构”,也就是说,架构的发展是为了更好地支撑应用。那么本文在介绍架构之前,先介绍一下Google所提供的主要产品有哪些?

产品

对于Google和它几个主要产品,比如搜索和邮件等,大家已经非常熟悉了,但是其提供服务的不只于此,并主要可分为六大类:

  • 各种搜索:网页搜索,图片搜索和视频搜索等。
  • 广告系统:AdWords和AdSense。
  • 生产力工具:Gmail和Google Apps等。
  • 地理产品:地图,Google Earth和Google Sky等。
  • 视频播放:Youtube。
  • PaaS平台:Google App Engine。

设计理念

根据现有的资料,Google的设计理念主要可以总结出下面这六条:

  • Scale,Scale,Scale Scale:因为Google大多数服务所面对的客户都是百万级别以上的,导致Scale也就是伸缩已经深深植入Google的DNA中,而且Google为了帮助其开发人员更好地开发分布式应用和服务,不仅研发了用于大规模数据处理MapReduce框架,还推出了用于部署分布式应用的PaaS平台Google App Engine。
  • 容错:一个分布式系统,就算是构建在昂贵的小型机或者大型机之上,也会不时地出现软件或者硬件方面的错误,何况Google的分布式系统还是浇筑在便宜的X86服务器之上,即使其设备标称的MTBF(平均故障间隔时间)很高,但是由于一个集群内的设备极多,导致其错误发生的几率非常高,比如李开复曾经提过这样一个例子:在一个拥有两万台X86服务器的集群中,每天大约有110台机器会出现宕机等恶劣情况,所以容错是一个不可被忽视的问题,同时这点也被Google院士Jeffrey Dean在多次演讲中提到。
  • 低延迟:延迟是影响用户体验的一个非常重要的因素,Google的副总裁Marissa Mayer曾经说过:”如果每次搜索的时间多延迟半秒的话,那么使用搜索服务的人将减少20%”,从这个例子可以看出,低延迟对用户体验非常关键,而且为了避免光速和复杂网络环境造成的延时,Google已在很多地区设置了本地的数据中心。
  • 廉价的硬件和软件:由于Google每天所处理的数据和请求在规模上是史无前例的,所以现有的服务器和商业软件厂商是很难为Google”度身定做”一套分布式系统,而且就算能够设计和生产出来,其价格也是Google所无法承受的,所以其上百万台服务器基本采用便宜的X86系统和开源的Linux,并开发了一整套分布式软件栈,其中就包括上篇提到的MapReduce,BigTable和GFS等。
  • 优先移动计算:虽然随着摩尔定律的不断发展,使得很多资源都处于不断地增长中,比如带宽等,但是到现在为止移动数据成本远大于移动计算的成本,所以在处理大规模数据的时候,Google还是倾向于移动计算,而不是移动数据。
  • 服务模式:在Google的系统中,服务是相当常用的,比如其核心的搜索引擎需要依赖700-1000个内部服务,而且服务这种松耦合的开发模式在测试,开发和扩展等方面都有优势,因为它适合小团队开发,并且便于测试。

整体架构的猜想

在整体架构这部分,首先会举出Google的三种主要工作负载,接着会试着对数据中心进行分类,最后会做一下总结。

三种工作负载

对于Google而言,其实工作负载并不仅仅只有搜索这一种,主要可以被分为三大类:

  • 本地交互:用于在用户本地为其提供基本的Google服务,比如网页搜索等,但会将内容的生成和管理工作移交给下面的内容交付系统,比如:生成搜索所需的Index等。通过本地交互,能让用户减少延迟,从而提高用户体验,而且其对SLA要求很高,因为是直接面对客户的。
  • 内容交付:用于为Google大多数服务提供内容的存储,生成和管理工作,比如创建搜索所需的Index,存储YouTube的视频和GMail的数据等,而且内容交互系统主要基于Google自己开发那套分布式软件栈。还有,这套系统非常重视吞吐量和成本,而不是SLA。
  • 关键业务:主要包括Google一些企业级事务,比如用于企业日常运行的客户管理和人力资源等系统和赚取利润的广告系统(AdWords和AdSense),同时关键业务对SLA的要求非常高。

两类数据中心

按照2008年数据,Google在全球有37个数据中心,其中19个在美国,12个在欧洲,3个在亚洲(北京、香港、东京),另外3个分布于俄罗斯和南美。下图显示其中36个数据中心在全球的分布:

pingdom_google_map_worldwide.jpg 图1. 2008年Google全球数据中心分布图

根据 Jeffrey Dean 在2009年末的一次演讲和最近几期季报可以推测出Google并没有在2009年过多地增加全球数据中心的数量,总数应该还是稍多于36个,但很有可能在台湾、马来西亚、立陶宛等地增加新的数据中心。

虽然Google拥有数据中心数量很多,但是它们之间存在一定的差异,而且主要可以分为两类:其一是巨型数据中心,其二是大中型数据中心。

巨型数据中心:服务器规模应该在十万台以上,常坐落于发电厂旁以获得更廉价的能源,主要用于Google内部服务,也就是内容交付服务,而且在设计方面主要关注成本和吞吐量,所以引入了大量的定制硬件和软件,来减低PUE并提升处理量,但其对SLA方面要求不是特别严厉,只要保证绝大部分时间可用即可。下图是Google巨型数据中心的一个代表,这个数据中心位于美国俄勒冈州北部哥伦比亚河畔的Dalles市,总占地面积接近30英亩,并占用了附近一个1.8GW水力发电站的大部分电力输出,当这个数据中心全部投入使用后,将消耗103兆瓦的电力,这相当于一个中小型城市的整个生活用电。

google DC.jpg

图2. Google在美国俄勒冈州哥伦比亚河畔的巨型数据中心近景图

大中型数据中心:服务器规模在千台至万台左右,可用于本地交互或者关键业务,在设计方面上非常重视延迟和高可用性,使得其坐落地点尽可能地接近用户而且采用了标准硬件和软件,比如Dell的服务器和MySQL的数据库等,常见的PUE大概在1.5和1.9之间。本来坐落于北京朝阳区酒仙桥附近的”世纪互联”机房的Google中国数据中心也属于大中型数据中心这类,其采用的硬件有DELL的工作站和Juniper的防火墙等,下图为其一角。

2008421124418.jpg

图3. Google前中国数据中心的一角(参[26])

关于两者的区别:具体请查看下表:

  巨型数据中心 大中型数据中心
工作负载 内容交付 本地交互/关键业务
地点 离发电厂近 离用户近
设计特点 高吞吐,低成本 低延迟,高可用性
服务器定制化
SLA 普通
服务器数量 十万台以上 千台以上
数据中心数量 十个以内 几十个
PUE估值 1.2 1.5

表1. 巨型与大中型数据中心的对比表

总结

最后,稍微总结一下,首先,普通的用户当访问Google服务时,大多会根据其请求的IP地址或者其所属的ISP将这个请求转发到用户本地的数据中心,如果本地数据中心无法处理这个请求,它很有可能将这个请求转发给远端的内容交互中心。其次,当广告客户想接入Google的广告系统时,这个请求会直接转发至其专业的关键业务数据中心来处理。

google architecture.PNG

图4. 总结

因为本文是基于现有的公开资料和个人的经验的总结和猜想,所以和Google实际的运行情况没有任何联系。

本篇结束,下篇将对Google App Engine及其主要组成部分进行介绍。

EOF

探索Google App Engine背后的奥秘(1)–Google的核心技术

按:此为客座博文系列。投稿人吴朱华曾在IBM中国研究院从事与云计算相关的研究,现在正致力于研究云计算技术。

本系列文章基于公开资料对Google App Engine的实现机制这个话题进行深度探讨。在切入Google App Engine之前,首先会对Google的核心技术和其整体架构进行分析,以帮助大家之后更好地理解Google App Engine的实现。

本篇将主要介绍Google的十个核心技术,而且可以分为四大类:

  • 分布式基础设施:GFS、Chubby 和 Protocol Buffer。
  • 分布式大规模数据处理:MapReduce 和 Sawzall。
  • 分布式数据库技术:BigTable 和数据库 Sharding。
  • 数据中心优化技术:数据中心高温化、12V电池和服务器整合。

分布式基础设施

GFS

由于搜索引擎需要处理海量的数据,所以Google的两位创始人Larry Page和Sergey Brin在创业初期设计一套名为”BigFiles”的文件系统,而GFS(全称为”Google File System”)这套分布式文件系统则是”BigFiles”的延续。

首先,介绍它的架构,GFS主要分为两类节点:

  • Master节点:主要存储与数据文件相关的元数据,而不是Chunk(数据块)。元数据包括一个能将64位标签映射到数据块的位置及其组成文件的表格,数据块副本位置和哪个进程正在读写特定的数据块等。还有Master节点会周期性地接收从每个Chunk节点来的更新(”Heart-beat”)来让元数据保持最新状态。
  • Chunk节点:顾名思义,肯定用来存储Chunk,数据文件通过被分割为每个默认大小为64MB的Chunk的方式存储,而且每个Chunk有唯一一个64位标签,并且每个Chunk都会在整个分布式系统被复制多次,默认为3次。

下图就是GFS的架构图:

Google-file-system.png

图1. GFS的架构图(参片[15])

接着,在设计上,GFS主要有八个特点:

  • 大文件和大数据块:数据文件的大小普遍在GB级别,而且其每个数据块默认大小为64MB,这样做的好处是减少了元数据的大小,能使Master节点能够非常方便地将元数据放置在内存中以提升访问效率。
  • 操作以添加为主:因为文件很少被删减或者覆盖,通常只是进行添加或者读取操作,这样能充分考虑到硬盘线性吞吐量大和随机读写慢的特点。
  • 支持容错:首先,虽然当时为了设计方便,采用了单Master的方案,但是整个系统会保证每个Master都会有其相对应的复制品,以便于在Master节点出现问题时进行切换。其次,在Chunk层,GFS已经在设计上将节点失败视为常态,所以能非常好地处理Chunk节点失效的问题。
  • 高吞吐量:虽然其单个节点的性能无论是从吞吐量还是延迟都很普通,但因为其支持上千的节点,所以总的数据吞吐量是非常惊人的。
  • 保护数据:首先,文件被分割成固定尺寸的数据块以便于保存,而且每个数据块都会被系统复制三份。
  • 扩展能力强:因为元数据偏小,使得一个Master节点能控制上千个存数据的Chunk节点。
  • 支持压缩:对于那些稍旧的文件,可以通过对它进行压缩,来节省硬盘空间,并且压缩率非常惊人,有时甚至接近90%。
  • 用户空间:虽然在用户空间运行在运行效率方面稍差,但是更便于开发和测试,还有能更好利用Linux的自带的一些POSIX API

现在Google内部至少运行着200多个GFS集群,最大的集群有几千台服务器,并且服务于多个Google服务,比如Google搜索。但由于GFS主要为搜索而设计,所以不是很适合新的一些Google产品,比YouTube、Gmail和更强调大规模索引和实时性的Caffeine搜索引擎等,所以Google已经在开发下一代GFS,代号为”Colossus”,并且在设计方面有许多不同,比如:支持分布式Master节点来提升高可用性并能支撑更多文件,Chunk节点能支持1MB大小的chunk以支撑低延迟应用的需要。

Chubby

简单的来说,Chubby 属于分布式锁服务,通过 Chubby,一个分布式系统中的上千个client都能够对于某项资源进行”加锁”或者”解锁”,常用于BigTable的协作工作,在实现方面是通过对文件的创建操作来实现”加锁”,并基于著名科学家Leslie Lamport的Paxos算法。

Protocol Buffer

Protocol Buffer,是Google内部使用一种语言中立、平台中立和可扩展的序列化结构化数据的方式,并提供 Java、C++ 和 Python 这三种语言的实现,每一种实现都包含了相应语言的编译器以及库文件,而且它是一种二进制的格式,所以其速度是使用 XML 进行数据交换的10倍左右。它主要用于两个方面:其一是RPC通信,它可用于分布式应用之间或者异构环境下的通信。其二是数据存储方面,因为它自描述,而且压缩很方便,所以可用于对数据进行持久化,比如存储日志信息,并可被Map Reduce程序处理。与Protocol Buffer比较类似的产品还有Facebook的 Thrift ,而且 Facebook 号称Thrift在速度上还有一定的优势。

分布式大规模数据处理

MapReduce

首先,在Google数据中心会有大规模数据需要处理,比如被网络爬虫(Web Crawler)抓取的大量网页等。由于这些数据很多都是PB级别,导致处理工作不得不尽可能的并行化,而Google为了解决这个问题,引入了MapReduce这个编程模型,MapReduce是源自函数式语言,主要通过”Map(映射)”和”Reduce(化简)”这两个步骤来并行处理大规模的数据集。Map会先对由很多独立元素组成的逻辑列表中的每一个元素进行指定的操作,且原始列表不会被更改,会创建多个新的列表来保存Map的处理结果。也就意味着,Map操作是高度并行的。当Map工作完成之后,系统会先对新生成的多个列表进行清理(Shuffle)和排序,之后会这些新创建的列表进行Reduce操作,也就是对一个列表中的元素根据Key值进行适当的合并。

下图为MapReduce的运行机制:

Map Reduce.PNG

图2. MapReduce的运行机制(参[19])

接下来,将根据上图来举一个MapReduce的例子:比如,通过搜索Spider将海量的Web页面抓取到本地的GFS集群中,然后Index系统将会对这个GFS集群中多个数据Chunk进行平行的Map处理,生成多个Key为URL,value为html页面的键值对(Key-Value Map),接着系统会对这些刚生成的键值对进行Shuffle(清理),之后系统会通过Reduce操作来根据相同的key值(也就是URL)合并这些键值对。

最后,通过MapReduce这么简单的编程模型,不仅能用于处理大规模数据,而且能将很多繁琐的细节隐藏起来,比如自动并行化,负载均衡和机器宕机处理等,这样将极大地简化程序员的开发工作。MapReduce可用于包括”分布grep,分布排序,web访问日志分析,反向索引构建,文档聚类,机器学习,基于统计的机器翻译,生成Google的整个搜索的索引”等大规模数据处理工作。Yahoo也推出MapReduce的开源版本Hadoop,而且Hadoop在业界也已经被大规模使用。

Sawzall

Sawzall可以被认为是构建在MapReduce之上的采用类似Java语法的DSL(Domain-Specific Language),也可以认为它是分布式的AWK。它主要用于对大规模分布式数据进行筛选和聚合等高级数据处理操作,在实现方面,是通过解释器将其转化为相对应的MapReduce任务。除了Google的Sawzall之外,yahoo推出了相似的Pig语言,但其语法类似于SQL

分布式数据库技术

BigTable

由于在Google的数据中心存储PB级以上的非关系型数据时候,比如网页和地理数据等,为了更好地存储和利用这些数据,Google开发了一套数据库系统,名为”BigTable”。BigTable不是一个关系型的数据库,它也不支持关联(Join)等高级SQL操作,取而代之的是多级映射的数据结构,并是一种面向大规模处理、容错性强的自我管理系统,拥有TB级的内存和PB级的存储能力,使用结构化的文件来存储数据,并每秒可以处理数百万的读写操作。

什么是多级映射的数据结构呢?就是一个稀疏的,多维的,排序的Map,每个Cell由行关键字,列关键字和时间戳三维定位.Cell的内容是一个不解释的字符串,比如下表存储每个网站的内容与被其他网站的反向连接的文本。 反向的URL com.cnn.www是这行的关键字;contents列存储网页内容,每个内容有一个时间戳,因为有两个反向连接,所以archor的Column Family有两列:anchor: cnnsi.com和anchhor:my.look.ca。Column Family这个概念,使得表可以轻松地横向扩展。下面是它具体的数据模型图:

Big Table Model.PNG

图3. BigTable数据模型图(参[4])

在结构上,首先,BigTable基于GFS分布式文件系统和Chubby分布式锁服务。其次BigTable也分为两部分:其一是Master节点,用来处理元数据相关的操作并支持负载均衡。其二是tablet节点,主要用于存储数据库的分片tablet,并提供相应的数据访问,同时Tablet是基于名为SSTable的格式,对压缩有很好的支持。

BigTable.PNG

图4. BigTable架构图(参[15])

BigTable正在为Google六十多种产品和项目提供存储和获取结构化数据的支撑平台,其中包括有Google Print、 Orkut、Google Maps、Google Earth和Blogger等,而且Google至少运行着500个BigTable集群。

随着Google内部服务对需求的不断提高和技术的不断地发展,导致原先的BigTable已经无法满足用户的需求,而Google也正在开发下一代BigTable,名为”Spanner(扳手)”,它主要有下面这些BigTable所无法支持的特性:

  • 支持多种数据结构,比如table,familie,group和coprocessor等。
  • 基于分层目录和行的细粒度的复制和权限管理。
  • 支持跨数据中心的强一致性和弱一致性控制。
  • 基于Paxos算法的强一致性副本同步,并支持分布式事务。
  • 提供许多自动化操作。
  • 强大的扩展能力,能支持百万台服务器级别的集群。
  • 用户可以自定义诸如延迟和复制次数等重要参数以适应不同的需求。

数据库Sharding

Sharding就是分片的意思,虽然非关系型数据库比如BigTable在Google的世界中占有非常重要的地位,但是面对传统OLTP应用,比如广告系统,Google还是采用传统的关系型数据库技术,也就是MySQL,同时由于Google所需要面对流量非常巨大,所以Google在数据库层采用了分片(Sharding)的水平扩展(Scale Out)解决方案,分片是在传统垂直扩展(Scale Up)的分区模式上的一种提升,主要通过时间,范围和面向服务等方式来将一个大型的数据库分成多片,并且这些数据片可以跨越多个数据库和服务器来实现水平扩展。

Google整套数据库分片技术主要有下面这些优点:

  • 扩展性强:在Google生产环境中,已经有支持上千台服务器的MySQL分片集群。
  • 吞吐量惊人:通过巨大的MySQL分片集群能满足巨量的查询请求。
  • 全球备份:不仅在一个数据中心还是在全球的范围,Google都会对MySQL的分片数据进行备份,这样不仅能保护数据,而且方便扩展。

在实现方面,主要可分为两块:其一是在MySQL InnoDB基础上添加了数据库分片的技术。其二是在ORM层的Hibernate的基础上也添加了相关的分片技术,并支持虚拟分片(Virtual Shard)来便于开发和管理。同时Google也已经将这两方面的代码提交给相关组织。

数据中心优化技术

数据中心高温化

大中型数据中心的PUE(Power Usage Effectiveness)普遍在2左右,也就是在服务器等计算设备上耗1度电,在空调等辅助设备上也要消耗一度电。对一些非常出色的数据中心,最多也就能达到1.7,但是Google通过一些有效的设计使部分数据中心到达了业界领先的1.2,在这些设计当中,其中最有特色的莫过于数据中心高温化,也就是让数据中心内的计算设备运行在偏高的温度下,Google的能源方面的总监Erik Teetzel在谈到这点的时候说:”普通的数据中心在70华氏度(21摄氏度)下面工作,而我们则推荐80华氏度(27摄氏度)”。但是在提高数据中心的温度方面会有两个常见的限制条件:其一是服务器设备的崩溃点,其二是精确的温度控制。如果做好这两点,数据中心就能够在高温下工作,因为假设数据中心的管理员能对数据中心的温度进行正负1/2度的调节,这将使服务器设备能在崩溃点5度之内工作,而不是常见的20度之内,这样既经济,又安全。还有,业界传言Intel为Google提供抗高温设计的定制芯片,但云计算界的顶级专家James Hamilton认为不太可能,因为虽然处理器也非常惧怕热量,但是与内存和硬盘相比还是强很多,所以处理器在抗高温设计中并不是一个核心因素。同时他也非常支持使数据中心高温化这个想法,而且期望将来数据中心甚至能运行在40摄氏度下,这样不仅能节省空调方面的成本,而且对环境也很有利。

12V电池

由于传统的UPS在资源方面比较浪费,所以Google在这方面另辟蹊径,采用了给每台服务器配一个专用的12V电池的做法来替换了常用的UPS,如果主电源系统出现故障,将由该电池负责对服务器供电。虽然大型UPS可以达到92%到95%的效率,但是比起内置电池的99.99%而言是非常捉襟见肘的,而且由于能量守恒的原因,导致那么未被UPS充分利用的电力会被转化成热能,这将导致用于空调的能耗相应地攀升,从而走入一个恶性循环。同时在电源方面也有类似的”神来之笔”,普通的服务器电源会同时提供5V和12V的直流电。但是Google设计的服务器电源只输出12V直流电,必要的转换在主板上进行,虽然这种设计会使主板的成本增加1美元到2美元,但是它不仅能使电源能在接近其峰值容量的情况下运行,而且在铜线上传输电流时效率更高。

服务器整合

谈到虚拟化的杀手锏时,第一个让人想到肯定是服务器整合,而且普遍能实现1:8的整合率来降低各方面的成本。有趣的是,Google在硬件方面也引入类似服务器整合的想法,它的做法是在一个机箱大小的空间内放置两台服务器,这些做的好处有很多,首先,减小了占地面积。其次,通过让两台服务器共享诸如电源等设备,来降低设备和能源等方面的投入。

本篇结束,下篇将猜想一下Google整体架构。

EOF

1e100.net,来自 Google

在 Alexa 上观测最近的一些数据的变化,发现了一个奇怪的域名: 1e100.net ,全球排名 45 。乍看上去,这个域名非常山寨,不过查询一下,发现这居然是 Google 的域名。Google 的名字是 Googol 这个单词拼错得来的,而 Googol 就是 10100 这个大数。1e100 = 1×10^100 = Googol (refer)。Twitter 上也有网友对此进行了提示。

1e100.net.png

这么看来,1e100 这样的域名风格倒是很 Google 化。从网上的反馈看,Google 有不少服务都在使用 1e100.net 这个域名,最多的应该是 Google Chrome 浏览器的 Safe Browsing 特性对地址的使用(对 Firefox 也有影响),而且会启用较多的并发连接,所以会有网站对此带来的压力无法承受而屏蔽 Google 的这个服务(refer),此外也让我想起以前 Google Chrome 早期的版本解析 DNS 多少有点慢,不知道是否有相关因果关系。Google 的其它产品包括 Google Toolbar、Google Analytics、YouTube 、FeedBurner 等服务也用这个域名。也有人发现 Google IPV6 地址也是通过这域名在进行测试。不过直接访问 1e100.net 是访问不到的,Google 通过子域名的形式进行使用。

按理说,这种不对外提供服务的地址,Alexa 没必要统计流量的,或许是他们的小失误倒是让我们了解到 Google 的一点有趣的信息。

EOF

更多参考:

更新:最新的消息说是 Google 不同数据中心间用来” identify servers, hinting that reverse DNS plays a role” ,关键词”Spanner”。

Google 现在有官方解释了:What is 1e100.net?
用于标记Google网络中的服务。主要有两个目的:1) 保持简单性; 2) 加强安全。

此文作者:, 位于 Web 分类 标签: on .
转载须以超链接形式标明文章原始出处和作者信息及版权声明.

Google带来的科普事件

在看到 Google 的 公开信 后,我在 Twitter 上说”宁与玉碎不为瓦全。也好”。之后一直想写点什么,不过在这个时候,阐述对这件事情的看法,很难不被淹没到口水战里。

揣测 Google 这样做的动机与商业目的对我们大多数人来说没有什么实际意义,不如让我们把讨论的焦点放在这次事件背后的问题上:这次实际上是客观承认了”内容审查”(refer: Censorship)变本加厉的既定事实,也让更多人知道了这一现状对社会带来的负面作用。对互联网的不当隔离与审查是不符合普世价值的,尤其不符合人民群众对于”先进生产力的发展要求“,是民众无法认同与接受的做法。Google 对于互联网来说是先进生产力的绝对代表者,如果将其拒之门外,那么可以肯定这无助于社会的进步。

如果说出于政治目的的审查有其可解释性,但是为了”倒洗澡水而把孩子也倒掉”则是极其错误的做法(当然,表面上都是以一些类似”保护未来的花朵”为借口,这和过去那些重大对立冲突的导火索何其相似也)。这种错误的做法还包括前一段时间的 IDC 整顿、域名整顿等一系列事件乃至要推行网站白名单的传说,这些都是操作层面上的极度不当。”疏”与”堵”,历史给我们带来无数次的经验教训,后者无疑是饮鸩止渴。我不知道在皇帝的新装的那个故事中,喊出来那家伙其实什么也没穿的小孩受到了什么对待,也不知道皇帝是否再次上演新装的闹剧。是在我们这里,似乎这样的闹剧无时无刻都在上演。

上网十年,从一个乐观者变成了悲观者。历史有的时候是进一退二,有的时候是以退为进,还是让我再乐观一次吧,期待 Google 这次准备撤离会唤醒我们更多的思考,给我们带来哪怕是一点点的进步。

EOF

更新:

在审查过程中造成的直接和间接的经济损失似乎少有人关注,不知道是否有经济学人关注这一领域。如果有人算一笔经济账,恐怕会是个惊人的数字。而有关部门相信也是投入了大量人力物力的,这也是不小的资金开销。

此文作者:, 位于 Review 分类 标签: on .
转载须以超链接形式标明文章原始出处和作者信息及版权声明.