使用pp架构形成计算机集群请求的地址无效_干货!史上最详细脑图《大型网站技术架构》...

1a053e447d9346365837edbc78a33736.png

1. 介绍一下

《大型网站技术架构》这本书可能很多人都看过,小编个人觉得真的是非常不错的一本书。

看完这本书后,你会对如何设计大型网站架构,有非常清晰的思路。

如果还没有读过的小伙伴,赶紧去读一读吧。

PS:小编这里有这本书的Kiddle电子版,如有需要可联系我获取哦!

324f856924c0973efccb5dddca1bbb35.png

2. 架构思路

1. 大型网站系统特点

既然谈的是大型网站架构,所谓“大型”网站,首先需要了解大型网站系统具有什么样的特点。一般大型网站系统都具有如下共同特点:

  • 高并发,大流量
  • 高可用
  • 海量数据
  • 用户分布广,网络情况复杂
  • 安全环境恶劣
  • 需求快速变更,发布频繁
  • 渐进式发展和演化

2. 大型网站架构核心要素

基于大型网站系统的特点,需要围绕这些特点来设计系统架构。基于此,可以概括出设计大型网站需要考虑的核心架构要素。

设计大型网站系统的核心架构要素:

  • 高性能
  • 高可用性
  • 可伸缩性
  • 可扩展性
  • 安全性

本书的核心内容其实就是针对这几个核心架构要素一一展开。

1. 设计『 高性能 』的网站架构

对于大型网站,设计高性能的架构一般从以下几个方面考虑:

  • 优化网站响应速度
  • 优化网站处理并发请求的能力
  • 优化数据存储的性能

所谓高性能,

从网站的用户角度来看,无非就是访问网站的『 响应速度要快 』。

从系统角度看,由于同时访问的用户数巨大,因此同时到达系统服务器的『 并发请求数 』非常大。

从后端数据存储来看,优化『 海量数据存储 』的能力,避免后端数据存储性能缓慢而成为系统性能瓶颈。

优化网站响应速度

重要提示:
网站性能优化第一定律:优先考虑使用缓存技术优化性能

优化网站响应速度的主要手段是使用『 缓存 』,使用缓存是提高网站响应速度效果最显著的办法。

例如对于前端,可以使用CDN,反向代理,这些都是利用的缓存技术。对于应用服务器的性能优化,一个主要的手段也是使用缓存,在提高响应速度的同时,也减轻了对后端数据库的压力。如果是有海量数据的超大型系统,甚至需要用到分布式缓存系统。

另外一个优化响应速度的手段是『 异步消息处理 』。异步消息处理是指,在应用服务器与后端服务之间使用消息队列,应用服务器总是将用户请求扔进消息队列,并立即返回用户,后端服务异步从消息队列中取出请求数据进行处理。由于请求发送到消息队列后就立即返回了,因此用户会感知到更快的响应速度。

使用消息队列还具有削峰的作用,当瞬间有大量请求到达系统后,这些请求数据会进入消息队列,而不会瞬间涌入后端服务器,从而起到保护后端服务的作用。

优化网站处理并发请求的能力

除此之外,还要支持巨大的并发请求数,一般手段是使用『 集群 』。

应用服务器一般需要从单台服务器扩展为多台服务器,构成应用服务器集群,然后引入负载均衡服务器,将用户请求分摊到不同的应用服务器进行处理。

集群可以很容易进行伸缩(增加或减少服务器数量),因此可以有效支持在不同场景下的不同并发请求量。如秒杀场景下,可以快速增加服务器到集群中,从而分摊用户请求,减轻其他服务器的压力。

优化数据存储的性能

单从优化数据存储性能方面来看,主要的优化手段有:

  • 使用性能更高的硬盘,如使用固态硬盘,读写速度更快。
  • 替换传统关系型数据库,使用NoSQL数据库。NoSQL数据库的数据读写速度一般优于传统关系型数据库。
  • 使用分布式文件系统。分布式文件系统具有并发读写能力,因此可以有效提高数据存储的并发能力。

2. 设计『 高可用 』的网站架构

重要提示:
实现高可用架构的主要手段是数据和服务的『 冗余备份 』和『 失效转移 』

所谓高可用,即在任何时刻,应该尽量保证系统是可用的。

使用集群实现数据和服务的冗余备份,当集群中某个服务器宕机时,失效转移机制会将用户请求分发到集群中其他可用服务器上,从而可以保证用户请求被正确处理。

使用集群有个前提条件是,各个服务器上运行的服务应尽量是无状态的这样各个服务器之间就不会存在差异。但是对于应用服务器,如果保存了用户Session数据,那么它们就是有状态的。这种情况下需要考虑如何处理Session状态数据。可以采用独立的分布式Session服务器集群来专门缓存用户Session数据,从而使应用服务器变成无状态的。

冗余备份与失效转移手段适用于网站系统的各个逻辑层,包括应用层,服务层和数据层。

3. 设计『 可伸缩 』的网站架构

系统的可伸缩性,通常容易与可扩展性混淆。

可伸缩性意味着当网站流量变大时,可以很容易通过增加系统部署实例来支持。可扩展性意味着系统架构可以很容易扩展,从而支持新业务功能系统。

为达到可伸缩的目的,通常需要将系统进行拆分。纵向进行逻辑分层,如分为应用层,服务层和数据层。横向进行业务分割,把不同的业务功能拆分出来,并且独立部署。

对于拆分出来的单一功能,也需要采用集群方式进行部署。但是对于不同类型的集群,实现伸缩的方式不太一样。

对于应用服务器集群,通常使用『 负载均衡 』来实现伸缩。当有新服务器加入集群时,负载均衡可以自动将用户请求分发到新服务器。

对于分布式缓存集群,当有新服务器加入集群时,为了保证缓存命中率,通常使用『 一致性 』算法,从而使请求能够绝大部分指向已经缓存了所需数据的服务器。

对于数据存储服务器集群,对传统关系数据库来说,通常的手段是进行『 主、从数据库复制 』实现读写分离,或者『 数据分库分片 』等。然而对于NoSQL数据库,很多NoSQL数据库天生就是为可伸缩海量数据存储而设计的,如HBase。

4. 设计『 可扩展 』的网站架构

网站系统架构应该是易于扩展的。通常的设计手段包括:

  • 使用分布式消息队列降低系统与系统之间的耦合性。当开发新系统后,只需要订阅消息队列的数据即可进行整合,而不需要修改已有其他系统。
  • 利用分布式服务抽取可复用的服务。对于通用业务功能,可以把它们抽取成可复用的服务。对于新业务需求,通常可以使用这些可复用的服务,进行简单的组装即可实现。
  • 使用具有可扩展的数据库。如使用支持ColumnFamily结构的NoSQL数据库,可以在现有数据表结构之上增删数据列。
  • 开放平台。通过开放平台接入第三方开发者开发的系统,扩展系统周边应用,形成生态圈。

5. 设计『 安全 』的网站架构

系统安全性,对于任何网站系统都是至关重要的。

对于大型网站,由于用户分布广,网络安全环境会更加复杂和恶劣,设计具有良好安全性的网站架构会更加具有挑战性。

一般可以考虑以下几个方面:

  • 防御常见的网站攻击手段。如XSS,注入攻击,CSRF攻击等。
  • 信息加密。对在网络中传输的数据进行加密后再传输。
  • 信息过滤。过滤掉垃圾信息,防止垃圾信息进入系统内部。

思维导图

以下是我亲自整理的思维导图

2506fa05a5be6d8d39ab912af638870c.png

如果上面的大图看着不方便,我也把它放在了Github,访问我的Github地址https://github.com/longyg/Study下载,然后用XMind打开轻松看,包括图里的详细标注也可以看得到啦。

7cf9cb03f8b4e48b3e8d12e1335c8ce4.gif

图: 网络

文: 新码农客栈

排版: 新码农客栈

扫码关注公众号,查看更多内容

64b9b84ee6b632ebf184af5628ef930d.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

泰坦尼克号数据_数据分析-泰坦尼克号乘客生存率预测

项目背景目标预测一个乘客是否能够在泰坦尼克号事件中幸存。概述1912年4月15日,泰坦尼克号在首次航行期间撞上冰山后沉没,船上共有2224名人员(包括乘客和机组人员),共有1502人不幸遇难。造成海难失事的原因之一是乘客和…

linux mysql服务器安装_Linux服务器MySQL安装

Linux服务器MySQL安装1. MySQL官网下载如图:2. 安装MySQL[rootiZ2zebb0428roermd00462Z /]# rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch#过滤MySQL:[rootiZ2zebb0428roermd00462Z /]#yum repolist all |grep mysql#ena…

python3 array为什么不能放不同类型的数据_来自俄罗斯的凶猛彪悍的分析数据库ClickHouse...

点击上方蓝色字体,选择“设为星标”回复”资源“获取更多资源大数据技术与架构点击右侧关注,大数据开发领域最强公众号!暴走大数据点击右侧关注,暴走大数据!ClickHouse相关文章推荐:战斗民族开源 | ClickHo…

mysql锁表查询_Mysql数据库锁情况下开启备份导致数据库无法访问处理分享

[背景简介]MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。mysql虽然功能未必很强大,但因为它的开源、广泛传播&#xf…

mysql直接执行文件格式_Windows 环境下执行 .sql 格式文件方式

windows 命令行中有2种执行 .sql 文件的方式:直接行文件 和 先进入mysql命令行然后执行文件。具体操作如下:1. 直接在windows命令行执行。打开windows命令行(winR打开运行窗口然后输入cmd,回车),进入mysql的本机地址,如果配置了环…

Java大数据处理的流行框架

大数据挑战 在公司需要处理不断增长的数据量的各个领域中,对大数据的概念有不同的理解。 在大多数这些情况下,需要以某种方式设计所考虑的系统,以便能够处理该数据,而不会随着数据大小的增加而牺牲吞吐量。 从本质上讲&#xff0c…

带有Prometheus的Spring Boot和测微表第6部分:保护指标

以前,我们使用Prometheus成功启动了Spring Boot应用程序。 Spring应用程序中的一个端点正在公开我们的指标数据,以便Prometheus能够检索它们。 想到的主要问题是如何保护此信息。 Spring已经为我们提供了强大的安全框架 因此,将其轻松用于…

使用AWS Elastic Beanstalk轻松进行Spring Boot部署

朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 几乎所有应用程序都依赖于身份验证。 开发人员以及雇用他们的公司都想确认谁在发出请求&…

mysql报错乱码_连接mysql服务器报错时,出现乱码

页头用了header(content-type:text/html;charsetutf-8);try{$this->dbonew PDO($dsn,$dbuser,$dbpassword);}catch(Exception $e){echo $e->getMessage();}连接失败时会报错,但是乱码,IE下编码查看是UTF-8,但是是乱码,如果选…

zookeeper 负载_ZooKeeper,策展人以及微服务负载平衡的工作方式

zookeeper 负载Zookeeper如何确保每个工人都能从工作委托经理那里愉快地完成工作。 Apache ZooKeeper是注册,管理和发现在不同计算机上运行的服务的工具。 当我们必须处理具有许多节点的分布式系统时,它是技术堆栈中必不可少的成员,这些节点…

高效的企业测试-集成测试(3/6)

本系列的这一部分将展示如何通过代码级以及系统级集成测试来验证我们的应用程序。 (代码级)集成测试 集成测试一词有时在不同的上下文中使用不同。 根据Wikipedia的定义,我指的是在代码级别上验证多个组件之间相互作用的测试。 通常&#x…

带Prometheus的Spring Boot和测微表第4部分:基础项目

在以前的文章中,我们介绍了Spring Micrometer和InfluxDB。 所以你要问我为什么普罗米修斯。 原因是Prometheus在InfluxDB的拉模型与推模型上进行操作。 这意味着,如果将千分尺与InfluxDB一起使用,则在将结果推送到数据库中时肯定会有一些开…

前端如何实现网络速度测试功能_分析Web前端测试要点,从架构原理上进行分析,希望大家能够掌握...

基于Web前端分析过程,大概有十几个测试要点,我们今天主要来讲解结合前五个要点进行详细解说。前端测试点主要针对前端展开,什么叫前端分析呢?就是我们所有的分析和测试要点所站的视角都是针对客户端或者浏览器来对系统进行分析和测…

将Websocket与Spring Framework和Vuejs结合使用

Websocket是客户端和服务器之间的全双工(持久)连接,因此两者可以彼此共享信息,而无需重复建立新的连接。 这消除了从客户端重复轮询以从服务器获取更新的需要。 并非所有浏览器都支持Websocket,因此我们利用SockJS ja…

python函数和模块的使用方法_Python学习06_函数和模块的使用

引入在写有些代码的时候,会发现有些步骤重复了多次,他也不像循环,都是相同的东西在重复,而是指做某件事情的步骤方法,做事的人或对象发生了改变,但是方法却没有改变。要想写出高质量的代码,首先…

tmemo 选择消除行_Divi模块,行和部分加入高级动画选项

一切元素的动画选项每个Divi模块,行和部分都带有高级动画选项,你可以使用这些选项来吸引访问者并使页面更加耀眼。Divi引入一个全新的动画系统,并将这些高级动画选项扩展到每个Divi模块,行和部分!这些新选项已合并到一…

java8 streams_Java 8 Friday:使用Streams API时的10个细微错误

java8 streams在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 Java 8星期五 每个星期五,我们都会向您展示一些不错的教程风格的Java …

python带参数装饰器 函数名_python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)...

一、函数名应用函数名是什么?函数名是函数的名字,本质:变量,特殊的变量。函数名(),执行此函数。python 规范写法1. #后面加一个空格,再写内容,就没有波浪线了。2.一行代码写完,下面一…

python逐行写入excel_快来看看Python如何玩转Excel

来源:ID(innerV)如何用Python来操作Excel文件呢?首先,使用pip 包管理器来安装两个包,安装命令:pip install xlrd pip install xlwt我们来看读取excel的例子,第1行,import 导入xlrd包第4行&#…

Java面试准备:15个Java面试问题

并非所有的访谈都将重点放在算法和数据结构上—通常,访谈通常只侧重于您声称是专家的语言或技术。在此类访谈中,通常没有任何“陷阱”问题,而是它们要求您利用内存和使用该语言的经验–换句话说,它们测试您对编程语言的了解。 但…