互联网系统面临怎样的挑战?

大型互联网系统一般有如下特点:

  • 用户多,分布广:全球用户服务;用户分布范围广,网络情况复杂

  • 高并发,大流量

  • 高可用:系统7x24小时不间断服务

  • 海量数据:存储、管理海量数据

  • 安全环境恶劣,易受网络攻击

  • 需求变更快,频繁发布,每周甚至每天数次发布

  • 从小到大,渐进式发展



应对高并发挑战的两个技术方向

  • 垂直伸缩

通过升级硬件和网络吞吐能力可以实现垂直伸缩,无需改变应用架构。

  • 通过使用RAID(独立冗余磁盘阵列)增加I/O吞吐能力

  • 通过切换到SSD(固态硬盘)改善I/O访问速度

  • 通过增加内存减少I/O操作

  • 通过升级网络接口或者增加网络接口提高网络吞吐能力

  • 升级服务器使用更多处理器或者更多超线程

缺点:特定程度成本剧增,系统制约,物理极限



  • 水平伸缩

通过增加服务器提升计算能力

互联网架构演化

No.0阶段:最简单的互联网应用架构

No.1阶段:应用数据分离

No.2阶段:使用缓存改善系统性能

No.3阶段:使用应用服务器集群改善系统的并发处理能力

No.4阶段:数据库读写分离

No.5阶段:使用反向代理和CDN加速网站响应

No.6阶段:使用分布式文件系统和分布式数据库系统

No.7阶段:使用NoSQL和搜索引擎

No.8阶段:业务拆分

No.9阶段:微服务及中台化



No.10阶段:大数据及智能化



互联网架构模式

互联网系统架构核心要素

高性能

高性能的架构是以用户为中心,提供快速的网页访问体验,主要参数有较短的响应时间、较大的并发处理能力、较高的吞吐量与稳定的性能参数。

可分为前端优化、浏览器优化、应用层优化、代码层优化与存储层优化:

  • 前端优化:网站业务逻辑之前的部分。

  • 浏览器优化:减少 HTTP 请求数,使用浏览器缓存,启用压缩,CSS JS 位置,JS 异步,减少 Cookie 传输;CDN 加速,反向代理。

  • 应用层优化:处理网站业务的服务器。使用缓存,异步,集群。

  • 代码优化:合理的架构,多线程,资源复用(对象池,线程池等),良好的数据结构,JVM调优,单例,Cache 等。

  • 存储优化:缓存、固态硬盘、光纤传输、优化读写、磁盘冗余、分布式存储(HDFS)、NoSQL 等。



高可用

大型网站应该在任何时候都可以正常访问,正常提供对外服务。因为大型网站的复杂性,分布式,廉价服务器,开源数据库,操作系统等特点,要保证高可用是很困难的,也就是说网站的故障是不可避免的。

如何提高可用性,就是需要迫切解决的问题。首先,需要从架构级别考虑,在规划的时候,就考虑可用性。

业内一般用几个 9 表示可用性指标,比如四个 9(99.99),一年内允许的不可用时间是 53 分钟。

不同层级使用的策略不同,一般采用冗余备份和失效转移解决高可用问题:

  • 应用层:一般设计为无状态的,对于每次请求,使用哪一台服务器处理是没有影响的。一般使用负载均衡技术(需要解决 Session 同步问题)实现高可用。

  • 服务层:负载均衡,分级管理,快速失败(超时设置),异步调用,服务降级,幂等设计等。

  • 数据层:冗余备份(冷,热备[同步,异步],温备),失效转移(确认,转移,恢复)。数据高可用方面著名的理论基础是 CAP 理论。(持久性,可用性,数据一致性[强一致,用户一致,最终一致])



可伸缩

在不改变原有架构设计的基础上,通过添加/减少硬件(服务器)的方式,提高/降低系统的处理能力:

  • 应用层:对应用进行垂直或水平切分。然后针对单一功能进行负载均衡(DNS、HTTP[反向代理]、IP、链路层)。

  • 服务层:与应用层类似。

  • 数据层:分库、分表、NoSQL 等;常用算法 Hash,一致性 Hash。



可扩展

方便进行功能模块的新增/移除,提供代码/模块级别良好的可扩展性:

  • 模块化,组件化:高内聚,低耦合,提高复用性,扩展性。

  • 稳定接口:定义稳定的接口,在接口不变的情况下,内部结构可以“随意”变化。

  • 设计模式:应用面向对象思想,原则,使用设计模式,进行代码层面的设计。

  • 消息队列:模块化的系统,通过消息队列进行交互,使模块之间的依赖解耦。

  • 分布式服务:公用模块服务化,提供其他系统使用,提高可重用性,扩展性。



安全性

对于安全问题,首先要提高安全意识,建立一个安全的有效机制,从政策层面,组织层面进行保障。

比如服务器密码不能泄露,密码每月更新,并且三次内不能重复;每周安全扫描等。

以制度化的方式,加强安全体系的建设。同时,需要注意与安全有关的各个环节。

安全问题不容忽视,包括基础设施安全,应用系统安全,数据保密安全等:

  • 基础设施安全:硬件采购,操作系统,网络环境方面的安全。一般采用正规渠道购买高质量的产品,选择安全的操作系统,及时修补漏洞,安装杀毒软件防火墙。

  • 应用系统安全:在程序开发时,对已知常用问题,使用正确的方式,在代码层面解决掉。

  • 数据保密安全:存储安全(存储在可靠的设备,实时,定时备份),保存安全(重要的信息加密保存,选择合适的人员复杂保存和检测等),传输安全(防止数据窃取和数据篡改)。

互联网架构技术一览



互联网系统架构是根据业务需求不断完善的,不同的业务特征做特定架构设计。

作业

一个典型的大型互联网应用系统使用了哪些技术方案和手段,主要解决什么问题?请列举描述。



互联网架构技术方案和手段

——高并发、高可用、高性能,互联网系统的三高问题

CDN:有些页面、活动页、图片等服务可以考虑推送到离用户最近的CDN节点。构建合适CDN可以承担90%互联网流量。

浏览器端缓存:设置请求的过期时间,如对响应头Expires、Cache-control进行控制。适用于对实时性不太敏感的数据,如商品详情页、商家评分、评价、广告词等。但对价格、库存等实时性要求比较高的数据,就不能做浏览器端缓存。

APP客户端缓存:为防止大促时瞬间流浪冲击,一般大促前把APP需要访问的一些素材(如js/css/image、等)提前下发到客户端缓存,还有首屏数据、地图的离线缓存。

接入层缓存:Nginx搭建一层接入层缓存。

应用层缓存:如Tomcat,可以用堆内/外缓存,堆外缓存也可用Local Redis Cache。

分布式缓存: 如果Local Redis Cache数据量太大,单服务器存储不了,就可以考虑分布式缓存。



服务降级:降级是万不得已而为之的,线上系统太过复杂,依赖的软硬件很多;主要考虑一旦出现问题,要考虑系统级别、业务功能模块的降级、非关键业务的屏蔽、远程服务降级到本地缓存。

限流:目的是防止恶意请求、恶意攻击或防止流量超出系统峰值;可以考虑恶意请求只到Cache,对于穿透到后端的流量可以考虑使用Nginx的limit模块处理。对于恶意IP可使用Nginx deny屏蔽。

分流:DNS切换机房入口;HttpDNS客户端分配分流,实现更精准流浪调度;LVS/HaProxy切换故障Nginx接入层;Nginx切换故障的应用层;应用部署定制化策略分流。

负载均衡与反向代理:常见的LVS、HaProxy、Nginx负载均衡可以实现上游服务器的负载均衡、故障转移、失败重试、容错、健康检查等,Nginx负载均衡本身也是反向代理服务,将用户的请求代理到上游服务器处理。

隔离术:隔离是通过将系统、资源分开,从而保证在发生问题时使其影响最小化,防止出现雪崩效应。隔离方式有以下几种:

  • 线程隔离,比如 Tomcat 有一个线程池,接收请求后就从线程池中分配一个线程进行处理。

  • 进程隔离,互联网系统中会包含多个模块。当系统访问量大了以后,局部性原理的效果显现出来,一定会有某个模块的访问比例是极高的,系统资源大部分都被其占用,就会影响其他模块的运行效率,其出现故障的概率也就更大,如果出现故障就可能导致整个系统不可用。这种情况下较好的解决方案就是使用进程隔离,把系统拆分为多个子系统实现物理隔离,互不影响。

  •  集群隔离,单实例服务无法满足需求后,就会部署多个服务,形成服务集群来提升性能。例如秒杀是比较特殊的服务,瞬时访问量会非常大,当发展到一定程度后,势必会影响其他服务,这时就可以把秒杀提取出来,与其他服务隔离开。

  •  机房隔离,随着系统规模的增大,对可用性要求的增加,会进行多机房部署。同机房的服务只调用同机房服务,不进行跨机房调用,如果一个机房发生故障,可以通过 DNS/负载均衡将请求切换到另一个机房。

  • 热点隔离,前面例子中的秒杀就属于热点,所以需要对其进行隔离。对于读类型的热点,可以使用 多级缓存 来处理。对于写类型的热点,可以使用 缓存+队列 的模式。

  • 资源隔离,常见的资源例如CPU、磁盘、网络。比如使用 docker 容器时,有的容器写磁盘非常频繁,就需要考虑为不同的容器挂载不同的磁盘。比如 redis nginx,我们可以为其绑定CPU来提升性能。再比如大数据计算集群、数据库集群应该与应用集群网络隔离。

  • 其他读写分离、动静分离,也属于隔离方式中的一种。

异地多活,灾备切换:异地指地理位置上的不同,多活指不同地理位置上的系统都能够提供业务服务;灾备切换包括多机房部署场景下的灾备切换和同一机房内部场景的灾备切换。



业务切分:例如可以切成首页、频道页、购物车、收藏夹、交易、结算等,不同域名单独部署。

读写分离:大多数互联网业务,往往读多写少,这时候,数据库的读会首先称为数据库的瓶颈,这时,如果我们希望能够线性的提升数据库的读性能,消除读写锁冲突从而提升数据库的写性能。再比如 Redis 集群,也可以使用读写隔离来提升可用性,读服务只读取从集群,主集群故障后,从集群还可用,并且当一个从集群出现故障后,还可以到另一个群中重试。

动静分离:动态和静态页面拆分,静态页面上CDN、单独部署,不和动态页面混在一起。

动态内容静态化:大型网站之所以能够快速响应高并发,因为尽量把动态网站静态化。

异步机制:通过异步化机制提升并发能力;使用消息异步化进行系统解耦;缓存数据更新异步化;实时价格、库存异步化。异步请求合并,重排。

消息队列:消息队列是用来解耦一些不需要同步调用的服务或订阅一些自己系统关心的变化。可以实现服务解耦、异步处理、流量消峰/缓冲。

图片服务:图片是很消耗服务资源的,网站开发在服务器架构上会将 应用和图片分离开,分别搭建;这样好处是:独立的图片服务器能有效降低页面请求时服务器资源的压力,确保方可在访问系统时,不会因图片问题而崩溃;便于做扩容、容灾(在相隔较远的异地建立n套相同的IT系统,当某处各种灾害法发生时,系统可以切换到另外一处,保持生产系统的业务不间断运行)和数据迁移。

分布式文件:分布式文件系统把大量数据分散到不同的节点上存储,大大减小了数据丢失的风险。分布式文件系统具有冗余性,部分节点的故障并不影响整体的正常运行,而且即使出现故障的计算机存储的数据已经损坏,也可以由其它节点将损坏的数据恢复出来

分布式数据库:由于单表数据量爆炸,数据操作(CRUD)效率很低 ; 关系型数据库在大于一定数据量的情况下检索性能会急剧下降;在面对互联网海量数据情况时,所有数据都存于一张表,显然会轻易超过数据库表可承受的数据量阀值;单机数据库的瓶颈问题,所以数据库只做存储用,为了方便扩展,动态增加数据库节点,进行分布式部署,保证扩展性好,不同业务对应不同业务数据库,即使某个数据库挂了,不影响其他数据库对应的服务使用,服务高可用。

NoSQL数据库:NoSQL,泛指非关系型的数据库。NoSQL数据库旨在解决大数据环境中的海量,多源和多格式的数据处理问题。与关系型数据库相比,NoSQL数据库具有更强的可扩展性和更好的性能,它弥补了关系型数据库的一些不足。

搜素引擎:优秀的搜索引擎需要复杂的架构和算法,以此来支撑对海量数据的获取、存储,以及对用户查询的快速而准确地响应。

推荐引擎:主动发现用户当前或潜在需求的定律,并主动推送信息给用户的信息网络。挖掘用户的喜好和需求,主动向用户推荐其感兴趣或者需要的对象;今日头条、抖音利用推荐引擎技术,使其异军突起。

大数据技术:大数据与新兴的机器学习,带给人们另一种从底向上的分析思路:首先建立分析型数据湖,将需要分析的数据均纳入湖中进行脱敏和标准化,之后利用机器学习、深度挖掘等分布式计算技术,在这些海量的数据中寻找规律。这种思路与传统数仓思路的最大不同,在于以历史数据展现出的事实为基础构建分析模型,而非与假设出的数据模型为基础进行构建。海量数据下,机器处理数据的能力需要智能化,淘宝利用大数据和机器学习,“结构化数据”+“非结构化数据”将可疑交易的监测识别范围从二维空间拓展至多维空间,通过对比每笔交易,统筹考虑相关人物、事件、内容、地点、时间、原因等要素在打击洗钱、假冒伪劣、贩毒、赌球犯罪等取得非常好的效用。



安全防护:对于安全问题,首先要提高安全意识,建立一个安全的有效机制,从政策层面,组织层面进行保障。比如服务器密码不能泄露,密码每月更新,并且三次内不能重复;每周安全扫描等。以制度化的方式,加强安全体系的建设。同时,需要注意与安全有关的各个环节。安全问题不容忽视,包括基础设施安全,应用系统安全,数据保密安全等:

李智慧 - 架构师训练营 第四周相关推荐

  1. 李智慧 - 架构师训练营 第一周

    总结 什么是软件架构? 什么是架构师? 如何做软件架构? 4+1视图模型 什么是模型? 为什么要建造模型? UML建模 作业 总结 架构师职责 架构师能力 什么是软件架构?  什么是软件架构,了解其 ...

  2. .NET 云原生架构师训练营(设计原则设计模式)--学习笔记

    ▲ 点击上方"DotNet NB"关注公众号 回复"1"获取开发者路线图 学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第180篇原创文章 ...

  3. .NET 云原生架构师训练营(系统架构)--学习笔记

    ▲ 点击上方"DotNet NB"关注公众号 回复"1"获取开发者路线图 学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第176篇原创文章 ...

  4. .NET 云原生架构师训练营(模块二 基础巩固 安全)--学习笔记

    2.8 安全 认证 VS 授权 ASP .NET Core 认证授权中间件 认证 JWT 认证 授权 认证 VS 授权 认证是一个识别用户是谁的过程 授权是一个决定用户可以干什么的过程 401 Una ...

  5. .NET 云原生架构师训练营(模块二 基础巩固 REST RESTful)--学习笔记

    2.3.1 Web API -- REST && RESTful 什么是 REST,什么是 RESTful RESTful API 设计 RESTful 成熟度模型 什么是 REST, ...

  6. .NET 云原生架构师训练营(模块二 基础巩固 配置)--学习笔记

    2.2.3 核心模块--配置 IConfiguration Options ASP.NET Core 中的配置:https://docs.microsoft.com/zh-cn/aspnet/core ...

  7. .NET 云原生架构师训练营(模块二 基础巩固 日志)--学习笔记

    2.2.2 核心模块--日志 ILogger 的使用 日志的 ID 日志的分类 日志的级别 LoggerProvider 日志的最佳实践 .NET Core 和 ASP.NET Core 中的日志记录 ...

  8. .NET 云原生架构师训练营(模块二 基础巩固 依赖注入)--学习笔记

    2.2.1 核心模块--依赖注入 什么是依赖注入 .NET Core DI 生命周期 服务设计 服务范围检查 ASP.NET Core 依赖注入:https://docs.microsoft.com/ ...

  9. .NET 云原生架构师训练营(模块二 基础巩固 引入)--学习笔记

    2.1 引入 http协议 web server && web application framework .net 与 .net core asp .net core web api ...

  10. 可复制领导力 - 极客大学架构师训练营 架构师老A

    说明 分享人: 架构师老A 分享主题:<可复制领导力> 分享提纲: 个人能力成长阶梯 东西方领导力差异 管理者角色认知 架构师老A自我介绍 老A亲爱的老师们,同学们,大家好晚上,今晚由我给 ...

最新文章

  1. 黑客窃取思科、IBM与甲骨文认证管理系统内的敏感数据
  2. 易语言怎么判断文件是否一样_怎么判断专利代理人或专利代理机构是否靠谱?...
  3. 动态规划基础——爬楼梯(Leetcode 70)
  4. 飞龙的程序员书单 – 其它
  5. 英伟达推出新款“煤气灶”Titan RTX,售价近2万,并开源PhysX SDK
  6. Java父类与子类中静态代码块 实例代码块 静态变量 实例变量 构造函数执行顺序...
  7. Grafana v6.0.0 发布,系统指标监控与分析平台
  8. 螺旋数组,之字形数组
  9. Firefox 2015 最受国人欢迎的十大扩展
  10. null object java_java1.8--Null Object模式
  11. 【第六届强网杯CTF-Wp】
  12. 【Netty之进阶篇】
  13. finecms aip.php漏洞,finecms V5 会员头像任意文件上传漏洞 附修复代码
  14. 个人信息安全保障冷冽现实:内鬼的威胁要远大于黑客
  15. 视频监控方面部分基础知识
  16. 计算机组成原理(一)绪论
  17. 中国计算机协会(CCF)A类期刊和会议
  18. 正确的IE卸载与重装方法
  19. Blender 制作一个简单的圆形
  20. LOL如何对一个英雄的技能进行测试 对一个英雄技能测试需要测试什么?

热门文章

  1. 易经读书笔记16 雷地豫
  2. vim-plug插件安装
  3. 性能优化 ---启动优化
  4. 解决外网下载速度过慢问题
  5. iOS 一一 frame和Bounds 以及frame和bounds区别
  6. 持续分化的 NFT 市场:新的金字塔正在形成
  7. 小纸条:阿里云资源分享站
  8. 如何辨别物理机和云主机?
  9. 获取银行卡Log接口
  10. rabbitmq中交换机类型direct和topic的区别