欢迎来到赛博朋克。
云计算,大数据,人工智能,区块链技术的产业化不断加深,移动支付,人脸识别,物联网深层次融入生活,软件技术已经从生活和娱乐的工具变成社会的中心议题,成为无所不在的媒介。生活的未来感越来越强,过去的想象成为今日之现实,再难以脱离技术的控制。
最近这两年来云原生的概念变得非常普及,很多的软件系统都以云为中心设计,更容易弹性伸缩,可以部署在多个地理区域,按使用量付费,服务也更加标准化,系统上线的时间大幅缩短。在云的世界里,我们所依赖的系统本身也使用软件来定义,隔离了物理基础设施的复杂性,我们不再感受到这些物的所在。将系统托付给 Amazon,Microsoft,Google 和阿里巴巴这些软件巨头管理,它们得到巨大的规模优势,因集中化的管理而降低了每单位维护成本,并积累控制复杂系统的工程技术经验,加深这种壁垒,对于小企业则愈加可望不可即。我们不再拥有自己的数据和计算,沦为一个租客,那些运行在遥远数据中心的节点随时可以被干预、停止甚至消除,如云朵一样飘忽、易逝。云正在吞噬整个软件世界,而云计算巨头则吞噬整个产业。
这些云计算巨头丝毫没有掩盖自己的野心,当越来越多的客户把系统托管在平台,它们还继续兜售各种增殖服务,能够更轻易地与平台集成,挤压提供类似服务初创企业的生存空间,也加深了平台锁定(Vendor lock-in),增大用户迁移到其他平台的成本。而且许多这样的服务只是现有开源软件的简单打包、运维和服务化,夺走了开源软件产业多年来自不易的成果。包括 PostgreSQL,MySQL,Cassandra,MongoDB,Redis,Elasticsearch,Kafka,Influxdb 等许多的开源软件都被云厂商打包成服务。而且这些开源软件生态已比较成熟,运维成本低,提供的接口也相对标准化,云平台可以获得很高的利润,而为此投入大量研发的中小公司接触客户的能力无法与这样的大平台竞争,商业模式面临严重的威胁。提供这些很容易获得的服务也使生态变得单一,如果大部分需求都能被标品满足,得到平台的背书和可移植性的优势,一个初创公司提供另类但更有优势的新服务就很难获得客户,对于新的编程范式、新的接口就较难被接纳和推广,未来新的数据库、流计算平台、分布式计算系统也就不敢标新立异而是倾向于兼容现有的接口,造成范式的锁定。
Google 为了在云计算市场建立自己的优势,拿出多年来最重要的调度系统 Borg 的设计,推出了开源的分布式容器编排引擎 Kubernetes,并建立了 CNCF 基金会大力推广,成为云计算服务集成的中心枢纽。Kubernetes 本身有很优秀的设计,但也有巨大复杂性,带来新的学习、维护、开发和集成成本。整个云计算生态在向 Kubernetes 靠拢,包括调度、网络、存储、权限、监控等软件都以此为核心,造成比较严重的锁定效应,如果你不使用 Kubernetes 就需要自己付出集成和维护的成本。但 Kubernetes 并不完美,也不是唯一好的方案,甚至不是一个很自然、舒服的软件开发方案,而是一个多层次、多组件、需要专业知识和精心维护的云计算操作系统。这让我很怀念早先用 capistrano 部署 rails 应用,用简单的工具很快速部署一个易于维护的集群,软件抽象非常简单,即使出问题也很容易调试。Erlang 的分布式集群架构也同样很优秀,Hashicrop 的 Nomad 也是 Kubernetes 不错的替代品,但用的人少,不够流行,在组织内使用较难得到支持。不同公司的系统架构变得越来越相似,当你问很多公司技术负责人在用什么技术,通常都是熟见名字的一些组合。因为 Kubernetes 难于维护,用户会更加依赖云平台的服务,这又加深了锁定。尽管 Kubernetes 依然是我工作中最重要的软件,但也必须说更像一个 trap,而不是 gift。
过去云计算是我们的梦想,未来云计算是我们的问题。云计算的经济和社会模型也值得关注,尤其是多租户,资源池化,按需使用,弹性伸缩,供给和需求的新模型,对数据和服务的锁定,标准和接口的统一和分化,云产业链上下游的不同环节的博弈,国家间的数据主权的争夺等等,都是值得考虑的因素。针对这些特点将能够设计未来的云计算架构,也针对云计算带来的问题对症下药。我们需要更低成本,更低能耗,更大自主权,更充分竞争,更加开放的云计算。在云的深处还有大量机会。
区块链今年的发展相对平静,没有特别重大的突破出现,去年推出的技术概念在今年得到了延续和深化,而应用层相对进展较慢。Cosmos,Algorand,Thunder,Nervos 这些公链经过漫长的开发纷纷在今年上线,Polkadot 和 Filecoin 则仍在加紧开发中。作为最主要公链的以太坊走向成熟,ETH 2.0 的蓝图历经许多波折逐渐清晰,但挑战也非常巨大,包括 Casper 共识、PoS 投票,Sharding 等等,还待一两年的时间才能完成,在这期间一些过渡性方案也将陆续实现。Layer2 则向着零知识证明的路线行进,出现了 Rollup 和 OptimisticVM。行业较为悲观,找不到突破口,应用层万籁俱寂,唯 DeFi 一枝独秀。真正的推力来自 Facebook 的 Libra 项目,激起整个行业的讨论,这也是社交巨头在面临根本商业模式危机之下一次转型的尝试,引起社会各界的巨大反弹,前途未卜,但数字货币引起了监管层和
决策层的高度关注,特别是在全球担忧美元霸权和金融系统稳定性的时刻,中国也在讨论央行数字货币,意欲争夺全球金融科技的主导权。区块链从来都不是一个纯技术的问题。
互联网正在面临一次深层次的革命,现在看到的各种创新和泡沫都是这次变革的发端。人们担心谷歌垄断互联网所有的数据,担心 Facebook 泄露用户的隐私,担心算法化的信息流推荐操纵人的心智,通过假新闻甚至可能干扰总统大选、影响社会稳定,监管机构纷纷采取极其严厉的监管措施,并开展反垄断调查,立法机构推出 GDPR 和 CCPA 的数据和隐私监管体系。中国一方面强调国家网络主权和技术的自主可控能力,也对数据爬虫和 APP 的数据获取进行监管,对社交媒体的强力监管也透着一种焦虑。在基础设施层面,云计算领域 Amazon 对计算资源的垄断和平台锁定,5G 领域因为华为与美国的博弈,人们也对通讯基础设施的安全和主导权进行辩论。这些迹象都说明互联网在变得高度集中化之后出现的问题,我们把数据和资源交给巨头,造成了一个高效但不稳定的系统,我们的安全和隐私没有得到保障,数据、传播话语权和利益分配机制不均衡,国家和国家之间、政府和企业之间、大公司和小公司之间的关系持续紧张。人们感到焦虑,缺乏安全感,呼唤着网络组织形态的变革。网络是载体,背后映射的是产业和社会结构的变化。
今年学到影响最深远的技术概念是 Capability,这是一种安全编程模型,通过一个不可伪造的 token 来在系统中允许访问某些功能和数据。不同于常用的 RBAC 权限模型,Capability 可以深度集成在语言和系统中,更好地跟踪访问权限的传递和清晰定义访问的范围。安全的语义不是系统外的一扇门,而是系统贯穿始终且不可分割的一部分,正如其中一篇论文的标题:Security Is Not a Separable Concern。Capability 的另外一个特点是可以更好描述授权的动态变化过程,权限管理不是静态的,总是有某个权威方可以分配和修改权限,这时候会体现出这种表达能力的优越性。Mark Miller 用 Capability 的概念做了一个 JavaScript 语言解释器 SES,能够运行受限的 JS 语言子集,可以在浏览器中运行不受信任的代码,而且赋予多少权限和访问接口可以根据 Capability 动态配置。另一个很好的应用是 Pony 语言 (https://www.ponylang.io/),使用 Reference Capability 来跟踪对变量的所有权和访问权限,任何时候都不会有多个线程对同一个资源的竞争使用,保证并发系统的安全性。
另一个重要的技术是 NDN,一种从头构建的全新互联网架构,想象互联网如果不是基于 TCP/IP 协议该如何设计。TCP/IP 是一个端对端的通讯模型,在两个 IP 地址端点之间经由若干中间节点的路由发送 packet 通讯,而 NDN(Named Data Network)则是一种状态同步网络的设计,用层次化的命名空间表示每个资源,当节点要访问某个资源,则向周围发送 Interest packet,附近的节点如果没有数据就向外路由直到获得这个资源,到达终点的响应 packet 会原路返回,并且在中间的节点路由起来,网络的所有路由节点都有 CDN 缓存的作用。这是一个 pull 模式的通讯机制,避免了 DoS 攻击。而且层次化的命名空间可以多级扩展,也解决了 IP 地址内网穿透的问题,跟分布式系统中的 TupleSpace 也很像。NDN 有很多独特的性质,但路由表会比较大一些,况且 ISP 缺乏升级基础设施的动力,让新的架构无用武之地。5G,IoT 和区块链的新浪潮给了 NDN 一些机会,但能否走向应用还是未知数。
今年早些时候看了不少数据库设计的论文,特别是 Amazon Aurora 的设计令人印象深刻。Aurora 是一个计算存储分离的数据库系统,下层是分布式数据存储层,上层是无状态的、可动态扩缩容的 MySQL/PG 节点,没有使用 Paxos 类的算法,而是使用 Quorum 来达成分布式系统的一致性,数据副本节点之间互相同步,保持着连续且一致的 prefix 不断向前推进。这种设计没有 leader,没有选举和切换的过程,可以多读多写,成员变更机制(membership change)也更简单易实现,在节点之间复制 redo log,可以大大降低 IO amplification,缩短 crash recovery 的时间。计算存储分离的架构也更适合云计算环境下多租户、动态扩缩容的需求。
另外看了一些 SyncFree 架构的分布式数据库论文,在地理分布式环境且参加节点较多的情况下,使用 Eventual Consistency 和 CRDT 的方式来设计数据库,EC 本身不保证事件的顺序,避免所有节点为了达成共识同步等待,当需要更强一致性保证时可以借助 Causal Consistency (因果一致性) 保持同一事务中两个因果相关事件的先后顺序。这个目录之下有很多优秀的数据库,对事务和一致性标准的设计也千差万别,这些系统使事务尽可能并行、无等待地处理,只捕获事务内若干个相关操作的依赖性,这种架构适用高延迟、高吞吐、超大规模、地理分布式的系统。目前产业化比较成熟的 BigData 系统都以 SQL 为核心,兼容 PG/MySQL 的语法,但是 SQL 没有办法表达 Conflict-Free/Commutative 的语义,可能需要设计新的数据库语言,比如基于 Erlang 的 Lasp (https://lasp-lang.readme.io/),能够原生表这种语义。区块链的 UTXO 机制天然表达了事务的依赖性,不依赖 Total Ordering,也值得借鉴。
今年也花了时间写写 Elixir,学习和探索 Erlang/OTP 的生态。Erlang 和 Beam 天然为分布式而设计,以 Actor Model 为核心,函数式的语义,以容错为中心的设计,节点发现,连接,RPC,监控,日志,调试等功能都有,内置 ETS 和 Mnesia 数据库管理程序的状态,还有成熟的 release 发布机制,不可谓不强大。很多人对这个技术栈敬而远之,觉得很复杂,实际上 Elixir 的语法非常简单,比 JavaScript 和 Python 更好学,和 Go 一样只有很少的语法概念,抽象层次也很扁平,非常用户友好,代码十分易读。更重要的是 Erlang 的 Actor 模型很适合云原生、分布式、serverless 的架构,有状态和无状态的部分可以很清晰分离,今天说的云计算架构,人家在二十年前就已经想清楚了,而且复杂性大大减少,灵活性大大增强。Actor Model 和进程树这种抽象天然就是最适合微服务的。但是大公司很难采纳这种小众的架构,更多倾向于人堆人,组件叠组件。如果想了解分布式,即使工作不使用,也应该学学 Elixir 和 OTP(或者 Akka)。
未来应该出现一种云原生的脚本语言,基于 Actor Model 或事件流,网络、存储、调度全部组件都可以单独抽象出来,依赖类似 Kubernetes 的编排,代码能够像容器镜像一样分发,构建过程可跟踪、可重现,有安全的沙箱或 Capability 的安全模型,资源隔离,可以运行在浏览器和边缘节点,运行在多租户环境,也可作为嵌入其他系统的 UDF 脚本,这是 serverless 的未来。
明年计划深入学习 Elixir/OTP,Rust 和 Pony,也想折腾一下 PyTorch,FoundationDB,git 和 CRDT。
年初看了 Alluxio 的论文,里面关于 lineage 的概念十分迷人。Lineage 即谱系的意思,在这个设计里用来跟踪不同计算任务之间的关联和依赖关系,基于这个依赖关系调度任务,让相关的任务及早加载到内存,在同一个节点计算,减少数据的等待和移动,当节点失效导致中间计算任务丢失,可以根据 lineage 关系重新计算丢失的状态,也可以根据恢复这个状态的代价分配优先级和决定是否做 checkpoint。Lineage 让人想到生活中许多事物的关联和依赖,许多人和事也因为这样或那样的原因牵连,任何时刻的你都因某个原因而在,这种存在也成为下一个状态的原因。过去 - 现在 - 将来,陷在因果交织的网中,置于不同的舍与得之间,当时间过去,交织的图景逐渐显现,这就是人与事与物之间的 lineage。
写于 2019-12-24
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。
