当前位置: 首页 > 科技观察

十分钟看懂分布式架构的前世今生

时间:2023-03-15 18:40:40 科技观察

对于每一个程序员来说,当大家听到分布式架构的时候,第一反应一般都是高端霸道、高端。比如阿里巴巴的各个系统部署在不同的机器上,也分布在杭州、上海、深圳的不同服务器上。华为的服务器也将分布在全球不同地区,以保证全球用户的使用。我们经常在各种招聘广告中看到它,对于分布式系统的开发我们也比较熟悉。那么,什么是分布式系统呢?这样,孩子们就能理解了。背景有人认为分布式就是按模块开发,按模块部署,分布式的核心是划分模块。但是,子模块不是分布式概念。早在20世纪90年代,就有人提出按模块划分软件功能。在软件工程上,子模块可以更好的解耦,在工作上,子模块也可以更好的分工。虽然是按模块开发的,但还是部署在同一台机器上。随着软件的发展,特别是互联网的发展,传统的单体架构越来越失效,主要表现在以下三个方面:性能问题。早期的互联网行业,硬件的发展非常迅速。计算机芯片可以将上一代的性能提高一倍。但是,随着摩尔定律的失效,硬件的提升还不如软件产业的发展。我们常说英特尔挤牙膏,因为现在芯片的性能比上一代要高。将其翻一番需要几代产品。因此单体架构的性能问题爆发,跟不上时代的步伐。很难扩展。原来每个模块只是逻辑上隔离,但还是部署在同一台机器上。每个模块之间,使用永阳的物理内存,同一个硬盘,同一个网卡。事实上,每个模块之间的依赖关系非常紧密,就像一台精密机器,有成千上万个齿轮,每个模块的变化都会带动其他齿轮的转动。系统可用性低。不难想象,所有模块在同一台机器上都是陌生的。如果某个模块出现问题,比如突然占满整个磁盘或者内存泄漏,就会影响到系统上的其他模块,导致整个系统出现故障。碰撞。特点与传统的单一结构相比,分布式最重要的点如下:更容易开发和实现新功能。在传统的单体结构中,模块之间的依赖关系非常严重。你要实现一个功能还需要评估对其他模块的影响。在分布式设计中,模块通过接口进行交互,一个模块的内部实现对其他模块是透明的,影响较小。单点故障的影响较小。传统单体架构的一个严重问题是,一个模块的故障很容易导致整个系统不可用。举个简单的例子,在电子商务系统中,评价系统可能没有那么重要。结果,有一天评估系统出现故障,内存泄漏,导致机器不断重启,极有可能影响部署在同一台机器上的其他应用。分布式部署可以大大降低失败的概率。当然分布式部署也会有失败的问题。这就需要优秀的分布式架构师搭建合理合适的框架,合理部署,避免单点故障。广泛的失败。系统吞吐量更大,以往的单点部署模块受限于单机性能。在分布式架构中,对于存在性能瓶颈的模块,我们可以采用异步或者部署更多机器来解决单机性能瓶颈问题,提高机器利用率。举个简单的例子,数据库模块对磁盘的性能和容量要求比较高。我们可以将其部署在磁盘更好的机器上。对于缓存来说,对CPU和内存容量要求较高的机器,可以获得更高的机器性能。利用率。分布式虽然解决了很多问题,但也有很多缺点和难点,需要程序员和架构师去克服和架构。主要难点异构系统标准不统一。在分布式系统中,每个模块可以选择自己的开发语言和部署环境,每个系统可以选择自己的数据结构和通信协议。有的人可能喜欢用HTTP协议进行通信,有的是google的gRPC,有的是Twitter的thrift。而且协议体、错误码、错误信息等数据结构可能不一致,不仅给开发带来不便,也给统一监控和治理带来很多麻烦。失败的概率更大了,因为机器数量增加了,单机的性能和质量可能不如以前了。同时,维护和开发的人员较多,单机故障概率会比单机结构大。这是一个不可避免的现象。没有处理过故障的工程师不是一个好的编码员。这就需要我们设计合理的分布式架构,降低故障发生的概率和影响,同时自动化运维。毕竟人总是会犯错的,而且是经常犯错的。服务依赖问题,不要以为一台机器把整个程序都挂了,那只会发生在单一架构中。在分布式环境中,也会有一些关键的服务。一旦挂掉,往往会引发多米诺骨牌效应,造成雪崩。例如,如果聊天软件中维护用户登录状态的Session服务出现故障,则所有服务都可能失去登录状态,导致整个服务不可用。Howtodo为了解决分布式带来的问题,需要所有的程序员和架构师各显神通。不管是什么方法,无非就是以下两点:提高系统吞吐量和提高系统可用性。