# 从架构变革看IT时代的演进

By [leaf](https://paragraph.com/@leaf-6) · 2022-11-25

---

对不同区块链架构进行了剖析，并对密码学、共识算法等关键技术做了详细的介绍；也提供了区块链中比特币和以太坊智能合约的开发指南；还介绍了区块链的应用案例，并讨论了区块链的常见问题。

学习架构的心得，并就架构变革驱动IT时代发展，以及从互联网+到区块链+的架构演进，与读者分享一些个人的心得和观点。

养成了关注典型IT架构的职业习惯。如果把区块链涉及的技术拆开来看，其实无论是虚拟货币、密码学、共识算法，P2P通信等技术，大部分都有迹可循，先于比特币出现。区块链之所以变得这么重要，主要是由于它把这些技术进行有机的组合，形成一个去中心化的、自动化执行交易、自治管理的架构。因此，与其说区块链是技术的革新，不如说是架构的革新。

大部分人容易把社会的进步，时代的变革归结于某项技术的发明，而忽视了起关键作用的其实往往是架构的创新。回顾IT发展的历史，每次重大的变革，不无例外是由于新架构的出现产生了新的能力，带来了新的应用，应用推动了变革。架构和技术的关系，有些像交响乐的指挥编排和各乐器演奏家的关系。就像一个杰出的指挥家指挥各种不同乐器演奏家协奏出气势恢宏的交响乐一样，一个好的架构，把提供不同技术功能的组件通过在空间、时间的排列组合，通过信息的沟通、协调，形成一个具备一定功能的完备计算系统。

计算机发展历史来看，每次技术革新，像机械技术、机电技术、电子管技术、半导体晶体管技术、集成电路技术、大规模集成电路技术，都给计算机的发展带来了推动力量，但真正具有划时代意义，起决定性作用的，还是计算架构的创新。这个从著名的图灵机模型就可见一斑。

英国科学家艾伦·图灵1937年发表著名的《论可计算数字，及其在判定性问题的应用》一文（英文名On Computable Numbers，with an Application to the Entscheidungsproblem.）。其中Entscheidungsproblem是德文“可判定性问题”的意思。“可判定性”意指对于一个判定问题，如果能够编出一个程序，以域中任意元素作为输入，执行该程序就能给出相应的个别问题的答案，就称该判定问题为可判定的。图灵在论文中提出了计算机抽象模型——图灵机的概念。图灵机由一个控制器、一条可无限伸延的带子和一个在带子上左右移动的读写头组成。这个在架构上如此简单的机器，理论上却可以计算任何直观可计算的函数。但同时，图灵也证明了不存在一个算法可以解决判定性问题。也就是说，有些计算问题是无解的。而所有能计算的算法都可以由一台图灵机来执行。图灵的理论证明了制造出能编程序来执行任何计算的通用计算机是可能的。

图灵机的意义在于，通过一个简单的架构，将原来只是生物具备的计算能力，赋予了无机物。这个是在人类历史上具有石破天惊影响和划时代意义的大事件。图灵机作为计算机的理论模型，奠定了现代计算机科学大厦的基础。

945年，根据图灵机模型，匈牙利籍科学家冯·诺依曼提出了“存储程序”（Stored-program）的概念。“存储程序”指的是把程序指令和数据放在同一个存储器上，程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置；采用单一的地址及数据总线，指令和数据宽度一样。处理器执行指令时，先从储存器中取出指令解码，再取操作数执行运算。程序计数器（PC）是CPU内部指示指令和数据的存储位置的寄存器。CPU通过程序计数器提供的地址信息，对存储器进行寻址，找到所需要的指令或数据，然后对指令进行译码，最后执行指令规定的操作，程序按顺序执行。后来这种体系架构被称为“冯·诺依曼”体系架构，也叫“普林斯顿”体系架构，如图11-1所示。它由输入、输出设备，中央控制单元（CPU）、存储器以及连接CPU和存储的总线构成。

图11-1　冯·诺依曼架构体系

![](https://storage.googleapis.com/papyrus_images/7962a545b260a2197a39b7720936484859063325d7a9eca821f6f69d1b255ad0.png)

由于程序指令和数据共用总线，因此冯·诺依曼体系架构的计算机并行能力差，数据处理速度慢，存在所谓的“冯·诺依曼瓶颈”。但该架构的特点是简单，不需要独立的程序存储和数据存储，大大减低了外设的复杂性。所以直到今天，这种架构仍是当前计算机的主流架构，绝大部分的计算机都属冯·诺依曼架构。典型的芯片像Intel、ARM的ARM7和MIPS等，都是支持冯·诺依曼架构的芯片。

最早的计算机器仅内含固定用途的程序。现代的某些计算机依然维持这样的设计方式，通常是为了简化或教育目的。例如一个[计算器](https://zh.wikipedia.org/wiki/%E8%A8%88%E7%AE%97%E5%99%A8)仅有固定的[数学计算](https://zh.wikipedia.org/wiki/%E6%95%B8%E5%AD%B8)程序，它不能拿来当作[文字处理](https://zh.wikipedia.org/wiki/%E6%96%87%E6%9B%B8%E8%99%95%E7%90%86)软件，更不能拿来玩[游戏](https://zh.wikipedia.org/wiki/%E9%9B%BB%E5%AD%90%E9%81%8A%E6%88%B2)。若想要改变此机器的程序，你必须更改线路、更改结构甚至重新设计此机器。当然最早的计算机并没有设计的那么可编程。当时所谓的“重写程序”很可能指的是纸笔设计程序步骤，接着制订工程细节，再施工将机器的电路配线或结构改变。

而存储程序型电脑的概念改变了这一切。借由创造一组[指令集结构](https://zh.wikipedia.org/wiki/%E6%8C%87%E4%BB%A4%E9%9B%86%E6%9E%B6%E6%A7%8B)，并将所谓的[运算](https://zh.wikipedia.org/wiki/%E8%A8%88%E7%AE%97%E7%90%86%E8%AB%96)转化成一串[程序](https://zh.wikipedia.org/wiki/%E7%A8%8B%E5%BA%8F)指令的执行细节，让此机器更有弹性。借着将指令当成一种特别类型的静态资料，一台存储程序型电脑可轻易改变其程序，并在程控下改变其运算内容。 **冯·诺伊曼结构**与**存储程序型电脑**是互相通用的名词，其用法将于下述。而[哈佛结构](https://zh.wikipedia.org/wiki/%E5%93%88%E4%BD%9B%E7%BB%93%E6%9E%84)则是一种将程序资料与普通资料分开存储的设计概念，但是它并未完全突破冯.诺伊曼架构。

存储程序型概念也可让程序执行时自我修改程序的运算内容。本概念的设计动机之一就是可让程序自行增加内容或改变程序指令的存储器位置，因为早期的设计都要用户手动修改。但随着变址寄存器与间接位置访问变成硬件结构的必备机制后，本功能就不如以往重要了。而程序自我修改这项特色也被现代程序设计所弃扬，因为它会造成理解与调试的难度，且现代中央处理器的流水线与缓存机制会让此功能效率降低。

从整体而言，将指令当成资料的概念使得[汇编语言](https://zh.wikipedia.org/wiki/%E7%B5%84%E5%90%88%E8%AA%9E%E8%A8%80)、[编译器](https://zh.wikipedia.org/wiki/%E7%B7%A8%E8%AD%AF%E5%99%A8)与其他自动编程工具得以实现；可以用这些“自动编程的程序”，以人类较易理解的方式编写程序[\[1\]](https://zh.wikipedia.org/wiki/%E5%86%AF%C2%B7%E8%AF%BA%E4%BC%8A%E6%9B%BC%E7%BB%93%E6%9E%84#cite_note-1)；从局部来看，强调I/O的机器，例如[Bitblt](https://zh.wikipedia.org/w/index.php?title=Bitblt&action=edit&redlink=1)，想要修改画面上的图样，以往是认为若没有客制化硬件就办不到。但之后显示这些功能可以借由“执行中编译”技术而有效达到。

此结构当然有所缺陷，除了下列将述的[冯·诺伊曼瓶颈](https://zh.wikipedia.org/wiki/%E5%86%AF%C2%B7%E8%AF%BA%E4%BC%8A%E6%9B%BC%E7%BB%93%E6%9E%84#%E5%86%AF%C2%B7%E8%AF%BA%E4%BC%8A%E6%9B%BC%E7%93%B6%E9%A0%B8)之外，修改程序很可能是非常具伤害性的，无论无意或设计错误。在一个简单的存储程序型电脑上，一个设计不良的程序可能会伤害自己、其他程序甚或是操作系统，导致[死机](https://zh.wikipedia.org/wiki/%E7%95%B6%E6%A9%9F)。[缓存溢出](https://zh.wikipedia.org/wiki/%E7%B7%A9%E8%A1%9D%E5%8D%80%E6%BA%A2%E4%BD%8D)就是一个典型例子。而创造或更改其他程序的能力也导致了[恶意软件](https://zh.wikipedia.org/wiki/%E6%83%A1%E6%84%8F%E8%BB%9F%E9%AB%94)的出现。利用缓存溢出，一个恶意程序可以覆盖[调用堆栈](https://zh.wikipedia.org/wiki/%E5%91%BC%E5%8F%AB%E5%A0%86%E7%96%8A)（Call stack）并改写代码，并且修改其他程序[文件](https://zh.wikipedia.org/wiki/%E6%AA%94%E6%A1%88)以造成连锁破坏。[存储器保护](https://zh.wikipedia.org/wiki/%E8%A8%98%E6%86%B6%E9%AB%94%E4%BF%9D%E8%AD%B7)机制及其他形式的[访问控制](https://zh.wikipedia.org/wiki/%E5%AD%98%E5%8F%96%E6%8E%A7%E5%88%B6)可以保护意外或恶意的代码更动。

哈佛架构
====

与冯·诺依曼架构不同的是哈佛体系架构。哈佛架构是一种将程序指令存储和数据存储分开的计算架构，如所示。

![](https://storage.googleapis.com/papyrus_images/2864d705de516dc543481ec607e4c95c8abbf71af9e272b305b8b39d41c66e12.png)

中央处理器首先到程序指令存储器中读取程序指令内容，解码后得到数据地址，再到相应的数据存储器中读取数据，并进行下一步的操作（通常是执行）。程序指令存储和数据存储分开，可以使指令和数据有不同的数据宽度。哈佛架构的微处理器通常具有较高的执行效率。其程序指令和数据指令分开组织和存储，执行时可以预先读取下一条指令。目前使用哈佛结构的中央处理器和微控制器有很多，包括信号处理芯片（DSP）、摩托罗拉公司的MC68系列、Zilog公司的Z8系列、ATMEL公司的AVR系列和ARM公司的ARM9、ARM10和ARM11。哈佛架构的优点是效率高，但架构复杂，对外围设备的连接和处理要求高，比较适用于外设少的应用场景，如嵌入式的单片机等。

### 哈佛架构的对比

改进的哈佛架构机更像哈佛架构机，但它松绑了指令和数据之间严格分离的这一特征，仍然允许CPU同时访问两个（或更多）内存总线。最常见的修改包括由公共地址空间支持的单独指令和数据高速缓存。当它作为一个纯粹的哈佛机时，CPU通过高速缓存来执行指令。当访问外部存储器时，它的作用就像一个冯·诺依曼机（代码可以像数据一样移动，像是一个功能强大的技能）。这一改良在现代处理器是普遍存在的，例如ARM体系结构、Power Architecture和x86处理器。它有时被称为哈佛架构，忽略了它实际上被“修改”的事实。

另一种修改提供了指令存储器（例如ROM或闪存）与CPU之间的通路，以允许来自指令存储器的字被视为只读数据。该技术用于某些微控制器，包括Atmel的AVR。这允许访问诸如文本字符串或函数表之类的常量数据，而无需首先将其复制到数据存储器中，从而为读/写变量保留稀缺（且耗电的）数据存储器。特殊的机器语言指令提供了从指令存储器中读取数据的功能。（这是不同于指令本身嵌入常数的数据，虽然对于单个常量来说，两种机制可以相互替代。）

有影响力架构的特点
=========

对于通用CPU来说，即使哈佛体系架构效率高，但复杂性和成本高的特点决定了不适用于通用场景。X86能够迅速占领市场，也是受益于采用简单实用的冯·诺依曼架构。由此可见，能对业界产生重大影响的架构一般具有以下特点：

（1）简单性

无论是图灵机模型还是冯·诺依曼架构，给人的第一印象是其简单性，也就是说构成架构的组件比较少，组件间的协同也比较简单，依托此架构做的产品也比较简单易用。

（2）完备性

构成架构的组件恰好不多不少，缺一不可，也不需要增加任何另外的元素就可以完全解决目标领域的所有问题。

（3）通用性

架构都具有一定的适用场景，太专用的场景不太可能产生影响力，因此通用性是形成主流架构的必要条件。

（4）权衡性

能流行的架构都会在效率和成本之间找到最佳的平衡点。只强调技术的先进性而忽视成本往往是很多产品失掉市场的原因。

（5）兼容性

好的架构一定是开放、兼容的架构。其实冯·诺依曼架构和哈佛架构也不是绝对对立的架构。现代的冯·诺依曼体系的芯片也吸收了很多哈佛架构的特点，比如CPU中的指令缓存等，都有哈佛架构的影子。

（6）扩展性

判断一个架构能否流行并可持续发展，最重要的指标是看其扩展性。好的架构，其扩展是通过简单的复制、排列和组合，将把最基础的系统做线性的扩展，使之功能和性能产生线性的增长。

1950年，图灵发表题为《计算机器与智能》（英文名《Computing Machinery and Intelligence》）一文，第一次提出了衡量机器是否会思考的标准——“图灵测试”。简单来说，图灵认为，如果把一个人和电脑隔开，让他们通过屏幕打字来对话，如果在持续5分钟的对话后，该人有70%的几率认为与之对话的是人而不是电脑，那电脑就通过了测试，可以认为电脑具备了像人一样的思考能力。如果我们从1997年5月11日IBM的深蓝电脑在六局比赛中以一胜五平的战绩战胜俄罗斯国际象棋世界冠军卡斯帕罗夫，还有2016年3月Google的AlphaGo以4∶1的压倒性优势战胜韩国围棋世界冠军李世石这两次人机大战结果来看，虽然这两次都不是严格意义上的图灵测试，但相信很少人会质疑电脑可以具备类似人类的智能。虽然电脑仍然需要输入依靠人类编写的程序，另外很多人类做起来比较简单的任务，例如模式识别、情感分析等，对电脑来说还很难，但其深度学习能力以及决策能力已经不容置疑。

可以说图灵在60多年前就预测到，作为人造无机物的电脑，通过在简单的图灵机架构的基础上的排列、组合，可以在某些方面逐渐演化成和人类智能匹敌的机器。到今天，大数据、人工智能（AI）以及机器人的发展，已经使得我们正式步入了一个无机物智能的时代。凯文·凯利在《失控》里的一个重要思想就是，人造无机物表现得越来越像生命体。一个名词“硅基智能”也应运而生，相对于作为生物的“碳基智能”而言，“硅基智能”可能更强大。因为从进化速度上，显然“碳基智能”没法和以摩尔定律速度发展的“硅基智能”相提并论。因此很多人认为，无机物智能超过人类智能会是一个必然很快发生的事情。所以，科学家霍金，企业家、特斯拉董事长马斯克，以及比尔·盖茨都对人工智能的发展态势表示担忧就不足为奇了。在2015年7月于阿根廷举办的2015年国际人工智能联合会议（IJCAI）上，超过千位科学家签署公开信，敦促联合国禁止开发自主性武器（autonomous weapons）。霍金、马斯克、沃兹尼亚奇（苹果创始人之一）等都进行了签署，第一次对人工智能所带来的威胁发出警告。

架构师工作中受到的一些启发。下面想谈谈对从互联网+向区块链+的发展趋势的一些观察和看法。

图灵机模型奠定了现代计算机的理论基础，而冯·诺依曼架构主导了60多年来计算机的发展。在这60年中，宏观层面的IT架构发生了几次大的变化。如果从一个构成IT系统的最底层的视角来看，这些大的变化可以归结为，在新的场景中为突破底层冯·诺依曼瓶颈而进行的上层架构调整。这个怎么理解呢？从单个计算机来看，冯·诺依曼架构在效率上的局限性是很明显的，主要表现在指令串行执行、程序和数据共享总线、计算和数据分离方面。而在IT层面碰到的问题，包括性能和扩展性问题，需要通过把底层的冯·诺依曼架构的电脑采用特定的协议按一定架构进行组合，以达到在整体上满足业务的功能和非功能方面的需求。

如果我们回顾IT架构的发展历程，我们可以将其大致分为传统集中式的大中型机时代、以PC为主的客户端/服务端（Client/Server）时代、互联网时代、云计算、大数据时代，到现在是互联网技术和传统行业深度融合的互联网+时代。下面我们简单介绍各个时代的情况。

在集中式的大中型机时代强调的是单机的能力、垂直扩展的能力。为了更好地提升资源利用率，各个层面的虚拟化技术，包括CPU分时系统、内存虚拟化、计算虚拟化等创新都在大型机时代出现。

在20世纪60年代，美国电脑科学家，也是首先提出人工智能（Artif icial Intelligence）概念的约翰·麦卡锡（John McCarthy）就提出了公用计算（Utility Computing）的概念，预言将来计算也可以像水和电那样作为公用服务提供。这个就是我们今天耳熟能详的云计算理念。

大型机的集中化管理以及从大型机产生的虚拟化技术，孕育了云计算的最早概念。但随着信息化的普及，大型机无论从成本、开放性和扩展性方面都不能满足日益多元化、普及化的信息处理的需求。

开放时代的到来
=======

20世纪70年代，随着UNIX操作系统和C语言的出现，开放、互联的理念开始萌芽，给IT架构的发展带来一线曙光。另外从大中型机和终端之间通信，到大中型机之间的通信的需求催生了网络技术的发展。在这个过程中，以太网技术、TCP/IP技术相继诞生。特别是在1981年，国际标准化组织（ISO）提出了开放体系互联架构的基本参考模型（OSI/RM），这个就是著名的OSI开放网络七层架构，奠定了在不同系统的不同应用相互进行透明通信的基础。

客户端/服务端（CS）分布式时代
================

到了20世纪80年代，个人对计算的需求催生了PC机时代的到来。随着PC的普及，局部联网的需求也越来越大。局域网的发展催生了客户端/服务端（Client/Server，CS）分布式架构。客户端/服务端架构实际上是把一部分原先在集中式主机中的工作负载分配到客户端上运行，减轻了主机的负担，提升了整个系统的并行处理能力。这个相当于在不改变每个电脑的冯·诺依曼架构的前提下，用在多个冯·诺依曼架构的小型电脑上并行运算，来取代一个在集中式的大型机里的串行计算。

分布式架构的一个重要特点是把计算、存储分布在网络中的多个节点上，通过软件来控制任务的分发和执行调度，这样任务能同时在多个节点上并行执行，同时给上层的应用提供一个访问远程节点如同访问本地系统一样的接口环境。早期的远程程序调用（RPC）、分布式计算环境（DCE）、普通对象请求代理（CORBA）等都是分布式框架。这些分布式框架强调的是计算的分布。分布的范围也是在企业的内网。

第一个分布式存储是是由DEC公司在20世纪70年代开发的分布式文件系统File Access Listener（FAL）。SUN于1985年发布第一个广泛使用的分布式文件系统NFS。其后像AFS、KFS、DFS、IBM的GPFS、SUN开发的Lustre等如雨后春笋般出现。

分布式架构改变不但节省了成本，还提高了效率，使得计算更靠近客户，而不是像过去那样，客户必须到与大中型机相连的终端上才能提交计算任务

互联网时代
=====

到了20世纪90年代，互联网开始普及。互联网突破了局域网的限制，使得计算可以跨越时空的限制。CS架构逐渐向BS架构（Browser-Server，浏览器-服务端）转型。BS架构将客户端统一到浏览器，使得应用在任何平台环境下都可以运行。这一时期，IT架构最关注的是开放性和可移植性，因为IT系统的资源非常宝贵，希望应用开发一次，可在所有IT系统上运行。在这个理念下，催生了Java这个高移植性的高级编程语言。

进入21世纪，随着应用越来越多，IT架构开始强调组件的专业化和分工协作。一个著名的架构原则叫“Separation of Concerns”（SOC），意思是对不同的问题要用不同的组件分开处理。这期间一个名叫“Model-View-Controller”（MVC）的三级架构开始流行，该架构就很好地体现了SOC原则。在MVC中，Model负责数据实体操作，View负责呈现，Controller负责控制逻辑。这个三级架构可以用在各个层面，小到简单的网站应用，大到企业CRM或ERP，MVC三级架构都得到广泛应用。

而互联网中最著名的HTTP协议的主要起草人Roy Fielding在他2000年完成的博士论文中提出了REST（Representational State Transfer）的架构理念，该架构理念奠定了互联网的架构基础。意思是“表示性状态传输”，单从字面上不好理解它的意思。实质上它是把世界上所有资源都用一个唯一的标志表示（Universal Resource Identifier，URI），对客户端每次请求，服务端都回复一个资源的表示性状态，而不是资源本身。

举个例子，用户在网页上浏览一条新闻，该请求会将指向新闻资源的URI发到服务端。服务端将根据URI找到该条新闻资源，并将其“表示性状态”，也就是用HTML或XML格式编写的新闻内容反馈给客户端；而新闻资源本身还是留在服务端。

在REST架构下，客户端/服务端的多个请求之间没有上下文的关联，上例中新闻资源的内在表示状态和回复给客户的表示状态就没有必然联系，如服务端的新闻资源可能是以数据库的形式存放的，接下来用户可能发一个观看视频的请求，这个请求和上面的请求完全无关，没有上下文的关联关系。服务端在接到请求后，将视频资源的“表示性状态”，也就是视频码流发给客户端。用户也可以通过发指令来修改资源的“表示性”状态或删除资源。没有“上下文”关系，也就意味着请求是无状态的，这样也就意味着可以不用担心状态的管理，而方便地扩展支撑互联网的基础设施，比如增加Web服务器来增强处理请求的能力等。

REST架构是超媒体（Hypermedia）浏览的最佳选择。超媒体就是用超链接（Hyperlink）的方式，将各种不同空间的文本或多媒体信息组织在一起的网状媒体，互联网的网页就是一个超媒体。REST架构在扩展性上具有无与伦比的优势，最后成为互联网的主流架构。REST架构能够成为主流，最重要的归结于它在架构上的简单性、兼容性和扩展性。当时以IBM和微软为首主推的基于SOAP的Web服务架构就因为过于复杂，而逐渐被REST边缘化。

分布式系统要比集中式系统更复杂，因为分布式系统要解决的问题是一致性（Consistency）、可用性（Availability）和分区容错性（Partition Tolerance）。一致性指的是在同一时刻，在每个节点都能读到最新写入的数据。可用性指的是一个运行的节点在合理的时间内总能响应请求，不会发生错误或超时。分区容错性指的是当网络分裂发生时，系统仍能继续工作。这些问题在集中式系统中都不是大问题。但在分布式系统，特别是在大规模的互联网分布式系统中却成为最大的挑战。

2000年，Eric Brewer教授提出了一个猜想，就是一致性、可用性和分区容错性三者无法在分布式系统中被同时满足，并且最多只能满足其中两个。而后这个猜想被证明，上升为大名鼎鼎的帽子理论（CAP Theorem）。CAP理论给分布式系统设计者的启发是：任何一个分布式系统的设计都要根据应用场景的不同而对一致性、可用性和分区容错性做取舍权衡，三者取其二，不能什么都想要，什么都不想舍。

传统企业级IT应用主要处理的是交易型数据，比如账务、库存数据，因此一致性是根本要求。大部分企业应用需要满足ACID要求。A代表Atomic，原子性，也就是一个交易要么全完成，要么全不完成，不能处在一个中间状态；C代表Consistency，一致性，指的是在交易开始前或结束后，关联数据必须保持一致；I代表Isolation，隔离性，也就是不同交易必须相互独立，完全隔离；D代表Durability，持久性，指的是交易后的数据能持久保存。

到了互联网时代，互联网应用主要是处理交互型数据，像分享的网页、图片等。交互型的数据比交易型的数据的体量大很多，这些数据对一致性没有很高的要求。但对计算的处理能力的要求比传统计算的要求要大得多。互联网环境和企业内网环境不一样，网络出现问题是常态而不是异常现象，因此互联网应用对可用性和分区容错性有很高要求，大部分互联网应用需要满足BASE要求。BA代表Basic Available，基本可用，也就是即使某个节点发生故障或网络断开发生，系统应该仍能正常工作而不报错；S表示Soft State，软状态，也就是暂时状态，指的是在某一时刻的某些节点上，允许不一致的暂时状态出现；E代表Eventual consistent，最终一致，也就是系统最后通过补偿机制或者其他纠错机制使得最终状态保持一致。

相比ACID应用，BASE的应用更具良好的扩展性，更适合于在互联网上运行的分布式系统。在互联网上如何做CAP三者的权衡？如何支持BASE的应用？如何满足处理不断增长的海量数据的计算能力的需求？

云计算、大数据时代
=========

1.谷歌的架构变革

从2003年到2004年，谷歌（Google）陆续发表了关于GFS、MapReduce和BigTable的3篇论文，基本上公开了谷歌内部用于处理搜索海量数据的平台架构。GFS是大规模的分布式文件系统，MapReduce是一个并行处理框架下的编程模式，BigTable是建立在GFS基础上一个按键值方式组织的非关系型数据库。由于当时的技术、产品和平台无法满足谷歌快速增长的业务发展，谷歌根据搜索业务的特点，大胆创新，打破了传统分布式文件系统的条条框框，开发了一个支持大规模扩展性的容错分布式文件系统，并在其基础上构建了并行计算平台和分布式数据库，使得谷歌的搜索平台能处理前所未有并不断爆炸性增长的海量数据。

特别是MapReduce的并行处理编程框架，通过软件对数据进行自动的切分，并把任务分配到不同节点上，实现自动调度、均衡工作负载，同时自动监控，自动修复错误，管理节点间通信。传统的并行处理应用，需要开发者掌握MPI编程等技能，一般只是限于高性能计算领域。而MapReduce框架简化了并行处理系统的编程，大大降低了开发者开发并行处理系统的门槛。可以说，MapReduce框架，使得先天缺少并行计算能力的冯·诺依曼架构的电脑，通过集群的并行处理，仍然能够在互联网时代焕发青春。

谷歌的3篇论文奠定了互联网大规模分布式系统的架构基础，掀开了大数据时代的帷幕。谷歌的贡献主要是基于其自身的业务需求，在对比传统分布式架构优劣势的基础上，提出了一套全新的分布式存储、分布式并行计算和分布式数据库的架构。但其特点还是在集中化模式管理下的可扩展分布式系统。

2.亚马逊的架构变革

谷歌是首先提出云计算概念的公司，而另一个首创云计算业务模式的亚马逊也不甘落后，于2007年发表了Dynamo分布式数据库论文。与谷歌相同的是，亚马逊也是根据自身的业务特点来做创新，都将系统出错作为常态处理；而与谷歌不同的是，亚马逊采用了一个无中心、完全分布式的架构。

亚马逊的Dynamo论文公开了分布式键值数据库Dynamo的设计和实施细节。Dynamo的设计主要是针对大规模电商的应用场景，例如购物车，需要提供“Always on”（总是在线），任何时候用户都能修改，也就是高可用的客户体验。其设计目标是把可用性提到第一位，在某些场合牺牲一致性。Dynamo论文很明确的提出“Eventual Consistency”（最终一致性）的概念。其设计理念参考Peer-to-Peer架构，整个分布式系统采用无中心架构。Dynamo综合了一些著名的技术来实现可伸缩性和可用性：数据划分（Data partitioned）和使用一致性哈希的复制（replicated），并通过对象版本（object versioning）提供一致性。在更新时，副本之间的一致性是由仲裁（quorum）中心化的副本同步协议来维持的。Dynamo中共涉及3个重要的参数，其中N代表数据的副本数，W代表一次写操作的最小必须写成功节点数；R代表一次读操作的最小读成功节点数。要求W+R>N，读数据时，只要有除了Coordinator之外的R-1个节点返回了数据，就算是读成功（此时可能返回多个版本的数据）。同理，写数据时，只要有除Coordinator之外的W-1个节点写入成功，就算数据写入成功。Dynamo采用了基于gossip协议分布式故障检测及成员（membership）协议。Dynamo只需要很少的人工管理，存储节点可以添加和删除，而不需要任何手动划分或重新分配（redistribution）。Dynamo很早就成为Amazon电子商务平台的核心服务的底层存储技术，它能够有效地扩展到极端高峰负载，在繁忙的假日购物季节也没有任何的停机时间。

Dynamo和BigTable都属于非关系型数据库，也就是常说的NoSQL数据库。但两者设计理念有很大的不同。Dynamo是完全无中心的设计，其假设是在内部信任网络部署，没有安全的措施。而BigTable是集中式管理，利用权限控制来提供安全措施。Dynamo的数据模型是键值模型，而BigTable是多维排序图。Dynamo采用一致性哈希来实现分布式元数据管理，而BigTable采用集中式的元数据管理。两者的适应场景也各不相同。Dynamo主要针对电商购物车应用，对可用性要求高，一致性要求不高，在CAP上强调对A（可用性）和P（分区容错性）的要求，是一个典型的AP数据库。而BigTable对一致性和可扩展性的要求比较高，比较适合处理结构化的数据，是一个典型的CP数据库。

3.云计算架构的特点

云计算双雄谷歌和亚马逊开启了云计算、大数据时代。但云计算、大数据的概念却很快沦为厂商炒作的概念，使得很多客户感到困惑。

美国的标准和技术组织（NIST）给了一个比较客观、经得起时间检验的定义，可以澄清很多误解。NIST给出的定义是：“云计算是一个提供泛在、方便、按需，并通过网络访问一个共享的可配置的计算资源池（包括网络、服务器、存储、应用和服务）的模式，该模式下资源能够迅速地被创建或释放，而不需太多的管理开销或服务提供商的人工干预。”

NIST还进一步总结出一个“三四五”要点来进一步阐释云计算概念：“三”是指云计算的3种服务模式（基础设施即服务IaaS、平台即服务PaaS、软件即服务SaaS）；“四”是指云计算的4种部署模式（私有云、公有云、混合云、社区云）；五”是指云计算的5个特点（按需自服务、宽带访问、资源池、快速弹性扩展、计量服务）。

前面我们在架构的特点中提到，架构不单单是技术的简单组合，其中很重要的是要权衡效率和成本，也就是说，在架构中的诸多考虑因素中，一个很重要的考虑因素是经济的因素。缺少合理经济模型的架构，是很难成为主流架构的，从冯·诺依曼架构和哈佛架构的对比可以看出这一点，从云计算的架构特征来看也是一样。

NIST的云计算定义还是太正式，太文绉绉地不好理解。用大白话来解释，云计算其实就是用容错、并行调度软件来把大规模的廉价的标准工业服务器组成资源池，把资源池的IT能力（具体包括计算能力、网络能力、存储能力、应用能力）转化成服务，以弹性按需的方式提供出去。这里面有几个值得关注的地方：

1）云计算是在分布式架构的基础上融入集约化管理的能力，具有集中化的架构特点。云计算时代，大部分的业务逻辑、数据处理都集中在运行于大型数据中心的云上，移动端主要是做展现。互联网时代的浏览器/服务端（BS）架构也逐渐向客户端/云端（CC）架构转型。

2）云计算架构是成本和效率的权衡。通过使用廉价的标准工业服务器，而不是昂贵的品牌设备来降低硬件成本，同时利用软件的容错来弥补廉价硬件质量的问题，并采用并行、虚拟化技术来提升资源的使用效率。

云计算是一种方便的提供计算、网络、资源以及在此之上构建的IT能力的一种服务模式。在该模式下会形成一个云计算所特有的架构特点。这些架构特点就是面向服务（Service Oriented Architecture）、资源池化（Resource Pooling）、软件定义（Software Defined）、标准化廉价硬件（Commodity Hardware）、计量服务（Measured Service）、水平扩展及弹性（Scale-out&Elastic）。其中软件定义和标准化廉价硬件对传统IT的冲击最大。软件定义网络、软件定义存储、软件定义安全的一个重要特点就是将控制层面与数据层面分离，将控制软件与硬件解耦，这样可以大幅度提高系统的开放性、扩展性和灵活性，也使得管理更为方便。另外一个从经济层面考虑的因素就是能大幅度降低成本，让传统IT网络、存储和安全厂商失去专用硬件的保护壁垒。而以标准化廉价硬件为目标的OCP（Open Compute Platform）以及天蝎计划则把话语权从传统厂商方面转到最终用户方面。不难想象，Cisco、EMC等以生产品牌产品为主业的传统厂商将会面临来自“白牌机”厂商的巨大挑战。

大数据产生的根源
========

BigData这个概念是在麦肯锡咨询公司在其2011年5月发表的报告《Big data：The next frontier for innovation，competition，and productivity》中首次提出。在其报告中给出的大数据定义是：大数据指的是大小超出常规的数据库工具获取、存储、管理和分析能力的数据集。

大数据概念一经提出，迅速占领媒体的封面，出现了各行业言必称大数据的局面。很多传统的BI、数据仓库方案也被重新包装，以大数据面目出现，甚至很多与大数据无关的项目，也被包装成大数据。大数据一时间成了一个包装标签。

国际数据公司（IDC）从大数据的4个特征来定义它，即海量的数据规模（Volume）、快速的数据流转和动态的数据体系（Velocity）、多样的数据类型（Variety）、巨大的数据价值（Value）。亚马逊的大数据科学家John Rauser则给出了一个简单的定义：大数据是任何超过一台计算机处理能力的数据量。

其实大数据的定义可能不是很重要，毕竟不同的角度观察可以有不同的定义。但有一个现象确实是不争的事实，数据量的指数型爆炸性增长给人类带来了前所未有的挑战。这个挑战表现在计算能力上，表现在支持计算的能力的能源消耗上。因为，计算后面需要有能源的支持。理论上来说，数据的增长永远会在越来越短的时间里倍增，但能源却没有办法跟随。最后结果只能是产生的数据被废弃。根据思科的预测，全球数据中心每年的IP流量会在2019年达到10.4ZB，平均每月863EB，几乎3倍于2014年的（2014年是3.4ZB，平均每月287EB）。这种增长速度将直接推动IT架构的创新和变革。

那为什么大数据的挑战会突然在21世纪初期出现呢？其实，冰冻三尺，非一日之寒，大数据现象是持续几十年的人类社会信息化、数字化的结果。回顾二三十年前，大部分的通信信号都是模拟信号。但数字化革命后，大部分的信号都从模拟信号转化成数字信号。IT的发展更加速了数字化的进程。早期的电脑只是把业务和管理信息化、数字化；互联网和移动互联网使得人与人的交流数字化；到了物联网时代，物与物的交互所产生的数据量会变得比前者更大。

大数据的出现，要求更大的计算处理能力，从而推动了IT架构的发展。Google的3篇论文实际上就是在这种背景下产生。

**目前大部分人看到的是大数据带来的机遇，希望通过大数据分析，能更准确地掌握客户需求，能够更好地把握市场变化的脉搏，能更快地通过大数据的辅助决策来响应业务的变化。如果说，大数据的处理能力需要云计算来支撑，那么，大数据的分析，就要与行业知识相结合，建立相应的行业大数据分析模型。而与行业进行深度结合，也催生了互联网+时代的到来。**

互联网+时代
======

互联网+时代实际上云计算和大数据时代的一个延伸，是云计算和大数据技术和行业深度融合的一个阶段，其实质是企业数字化转型。

1.互联网+——企业数字化转型

IDC认为，IT行业正在进入以云计算、移动互联、大数据和社交媒体为代表的第三平台时期。IBM也提出向CAMSS（Cloud，Analytics，Mobile，Social，Security）领域全面转型。在国内，“互联网+”成了2015年一个最凝聚共识的词。上至国家领导人，下到老百姓，都在热议“互联网+”。“互联网+”的一个重要特点是实现传统企业的数字化转型，而云计算是承载企业数字化的架构和平台基础。

对于“互联网+”的内涵和外延有很多争论。比较趋同的看法是：“互联网+”是互联网时代从消费互联网向产业互联网过渡的一个重要阶段，其主要特点是传统行业采用“互联网思维”来创新业务模式，利用互联网和大数据技术，通过线下、线上的紧密结合，为客户提供更好价值的服务和产品。如此一来，也产生了各种互联网技术与行业结合的模式，例如：互联网+金融、互联网+制造、互联网+教育、互联网+金融、互联网+交通、互联网+能源等。

2.互联网+金融——Fintech

其中互联网+金融成为最引人关注的领域。在国外，与互联网+金融对应的概念叫Fintech（中文意思是“金融科技”）。Fintech最早源于用于大型金融企业的后台的IT技术，包括账务系统、交易平台、支付、结算、清算等技术。进入互联网时代，Fintech的概念外延延伸到覆盖支撑金融行业业务创新的IT技术，包括P2P借贷、众筹、移动支付、虚拟货币、客户行为大数据分析等。

典型的代表是P2P借贷的Prosper和LendingClub，移动支付的谷歌钱包、苹果钱包、阿里的支付宝和腾讯的微信支付、资金整体管理平台Mint、智能理财顾问（Robo-advisor）LearnVest，以及比特币Bitcoin等。

3.区块链——Fintech的天之骄子

前面我们谈到，一部IT架构发展的历史，经历了从大型机集中式，到CS分布式，再到云计算集中式的发展。分久必合，合久必分，历史不是简单的重复，而是以螺旋上升的轨迹发展。我们看到，谷歌的3篇论文都是关于以集中式的架构来管理分布式的计算。这样的好处是统一了元数据管理和调度，同时保证了一致性。而亚马逊的Dynamo架构，则有明显的去中心化的特点。中心化架构的一个很大的问题就是管理节点的性能瓶颈，容易成为攻击目标。还有一个最重要的问题就是在一个大的分布环境里建立、维护中心节点的信任所需要的成本非常大。

中心化的架构还有一个重要问题就是，如果管理中心节点的人的发生主观错误，或有诚信问题，或者受第三方影响而失掉独立性，将会对整个网络带来灾难性的影响。比特币的发明人中本聪于2009年1月3日在挖出的第一个创世纪比特币区块中留言：“Chancellor on brink of second bailout for banks”。这句话是当天在英国泰晤士报登的封面头条新闻，中文意思是“财长处于第二轮银行紧急救助的悬崖边缘”。当时所处的背景正是席卷全球的金融危机的愈演愈烈的时期。据普林斯顿出版的《比特币和密码学技术》一书的作者分析，中本聪是出于对中心化的银行体系滥发货币、不加节制的扩张信用不满，而开发了一个完全去中心化的虚拟货币系统。中本聪一开始就开放比特币系统源码，比特币系统也不受任何人控制，比特币系统的总货币发行量也设计成固定的2100万比特币，按一定的规则逐渐发行。因此，比特币像黄金那样，具一定的稀缺性，是一个不会通胀的虚拟货币。

比特币自2009年上线以来，已经不间断地正常运行了7年多。比特币的试验证明，完全无中心化的分布式架构可以在陌生环境下通过合适的经济模型（挖矿激励）和共识算法形成信任。这就规避了中心化分布式架构在中心节点的致命弱点。同时，比特币底层的区块链架构也解决了一个互联网无法解决的问题，就是高昂的信任建立和维护成本。另外区块链通过密码学的签名、哈希算法解决了在互联网上难以解决的防伪问题。还有一个不太引人注意的独特地方是，在区块链上的计算需要用“燃料”（Gas）或交易费支撑，也就是说，计算与支撑计算的成本绑定。这和传统IT架构有很大的不同。在传统IT架构中，没有金融的元素。这样做的隐患是可以通过计算来攻击计算，这也是目前在互联网上无法杜绝的“拒绝服务”（DDoS）攻击的原因。而在区块链上，DDoS攻击的可能性大为减少，因为发动DDoS攻击需要动用很大的虚拟货币储备。这个无论从成本上还是攻击源的掩饰上都会给黑客带来很大的不利影响。因此，区块链是天然的和金融紧密结合的IT架构。

更重要的是，结合脚本引擎、密码学和虚拟货币机制，区块链上可以实现支付、自动结算和清算。因此，区块链也被Northwest Passage Ventures公司的CEO Alex Tapscott称为“价值互联网”。

因此，区块链的意义是不言而喻的。特别是对金融行业来说，信用风险是传统金融业中一个挥之不去的梦魇。但区块链却带来了解决信用风险的近乎完美的解决方案。因此，区块链技术被认为是下一代互联网颠覆性技术也就不足为怪了。华尔街日报甚至宣称，区块链是最近500年以来在金融领域最重要的突破。因此，区块链可以说是Fintech领域中当之无愧的天之骄子。

根据过往的历史，我们不妨大胆假设，未来能真正解决该问题的，一定不是某一项技术，而是集多种技术为一体的某种新架构。我们也可以更进一步地大胆假设，在这个新架构中，量子计算可以解决计算能力的问题；神经系统计算可以解决智能认知的问题；而更关键的是，区块链可以解决电脑、机器人行为规范、自治管理的问题。

如此想来，未来还是充满机遇，因此我们也对未来充满憧憬和希望。

---

*Originally published on [leaf](https://paragraph.com/@leaf-6/it)*
