• 01 大型架构的演进之路


    一、大型互联网系统特点

    1. 高并发和大流量 如天猫双11,一分钟内有超过一千万的独立用户访问整个天猫系统,大规模并发用户访问对系统处理能力造成巨大冲击,系统需要有足够强的处理能力

    2. 高可用 大型互联网系统必须要7X24小时不间断提供服务,为此要对系统做特别的架构设计

    3. 海量数据存储 因为互联网需要满足大量的用户使用,这些用户会产生很多数据,需要对这些数据进行重组和管理。除了用户提交的数据,互联网还会采集很多其他数据,包括一些用户行为数据,第三方数据和网络爬虫数据,通过大数据技术对这些数据做进一步分析,对用户做更精准的营销和服务,已发现新的业务增长点

    4. 用户分布广泛,网络情况复杂 互联网是为全球用户服务,为了使所有用户得到统一的良好体验,需要对系统架构进行相关设计

    5. 安全环境恶劣 互联网是开放的,很容易受到攻击

    6. 需求变化快,发布频繁 大型网站的产品发布一般以周为单位,每个星期都会发布新的版本来更新产品特性

    二、系统处理能力提升的两种途径

    1. 垂直伸缩 提升单台服务器处理能力,如用更快频率、更多核的CPU,更大的内存,更快的网卡,更多的磁盘组成一台服务器 缺点:

      • 到一定程度后,继续增加服务能力需要花费更多的钱,从服务器到小型机,到中型机,再到大型机

      • 有物理极限,单台服务器处理能力终究是有极限的,而互联网的需求是没有极限的

      • 操作系统的设计或者应用程序的设计制约着垂直伸缩。在单一服务器上运行的程序,就需要充分利用系统资源,然而应用程序的核心价值是处理业务逻辑从而满足用户需求,如果应用程序大量代码去管理系统资源,必然导致应用程序复杂度提高,难以开发和维护

    2. 水平伸缩 并不是提升单台服务器处理能力,而是使用更多服务器,将这些服务器构成一个分布式集群,这个集群统一对外服务,来提高系统整体处理能力

      水平伸缩没有垂直伸缩那些问题,只要架构合理,能够将服务器添加到集群中,系统就可以始终正常运行,没有极限,成本也不高。

    三、大型互联网架构演化过程

    1. 单机系统
      最早的时候,用户量少,业务逻辑不复杂,也就几个主要功能。应用开发完后部署在服务器上,访问自己服务器上的数据库和文件系统,如下图

      当系统体验良好,使用的用户越来越多,单个服务器就无法承受访问压力了,需要对服务做一次升级,就做了如下图的数据库和文件系统与应用程序分离,部署在不同的服务器上

    2. 缓存
      随着用户量继续增大,三台服务器也不能承受访问压力了,那就需要使用缓存来改善性能了。如下图,引入缓存系统,并对数据库做了读写分离,而应用程序部署到多台服务器上,并使用代理服务器做负载均衡

    3. 反向代理和CDN加速
      CDN(Content Delivery Network,内容分发网络)服务就是部署在网络运营商机房里的离用户最近的一个服务器,用户请求先到这里查看有没有需要的数据,如果有就从CDN直接返回,如果没有就通过CDN进一步访问网站的数据中心,得到数据后同时缓存到CDN,供其他用户或下次访问使用,CDN本质也是一个缓存。 用户请求到达网站数据中心后,先在反向代理服务器中查找是否有需要的数据,如果有就直接返回,否则再去请求应用服务器。这两个缓存结合可以返回绝大部分用户请求的数据了,极大减少了应用服务器负载压力,提升数据中心处理能力,响应更多用户并发处理请求

    4. 分布式文件系统和分布式数据库系统
      服务器性能的瓶颈主要是I/O,随着用户量增加,还是会有大量用户到达数据中心,这时数据库和文件系统依然会成为性能瓶颈。 通过一组服务器集群统一对外提供文件服务,这就是分布式文件系统 对数据库做进一步水平伸缩,使用分布式数据库。通过数据分片的方式,将一张表的数据分布在多个物理服务器上,以减少单一数据库的服务器访问压力。

    5. 消息队列与分布式服务 随着用户量进一步增加,要想实现更强大的计算处理能力,可以使用的技术手段有分布式消息队列、搜索引擎和NoSQL,以及通过分布式服务,将复用的业务分离开来,部署在不同的服务器集群上。 随着业务增加,很多业务都有一些重复的服务功能需要复用,这时候使用分布式的服务去解决服务的复用问题。而不同服务、不同应用之间的耦合关系使得系统变得复杂,这时候使用分布式消息队列服务,将不同应用服务进行解耦,通过消息进行连接,而不是服务调用或应用调用方式连接。服务或应用间的低耦合使得服务变得简单,使得系统处理能力和扩容能力变得强大。

     

  • 相关阅读:
    js中当call或者apply传入的第一个参数是null/undefined时,js函数内执行的上下文环境是什么?
    闭包的实现原理和作用以及堆栈溢出和内存泄漏原理和相应解决办法
    JavaScript的作用域和作用域链
    词法作用域和动态作用域
    理解 es6 中class构造以及继承的底层实现原理
    new一个对象的详细过程,手动实现一个 new操作符
    实现继承的几种方式以及他们的优缺点
    理解JavaScript的执行上下文栈,可以应用堆栈信息快速定位问题
    原型和原型链-instanceof的底层实现原理
    js判断变量未定义
  • 原文地址:https://www.cnblogs.com/hujiapeng/p/13526875.html
Copyright © 2020-2023  润新知