训练营第四周作业 1

用户头像
仲夏
关注
发布于: 2020 年 10 月 18 日

作业一:

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

与传统的企业应用相比,大型互联网应用系统有以下特点:

  • 高并发,大流量

需要面对高并发用户,大流量访问。

  • 高可用

系统7×24小时不间断服务,

  • 海量数据

需要存储、管理海量数据,需要使用大量服务器。

  • 用户分布广泛,网络情况复杂

许多大型互联网都是为全球用户提供服务的,用户分布范围广,各地网络情况千差万别。在国内,还有各个运营商网络互通难的问题。

  • 安全环境恶劣

由于互联网的开放性,使得互联网站更容易受到攻击,大型网站几乎每天都会被黑客攻击。

  • 需求快速变更,发布频繁

和传统软件的版本发布频率不同,互联网产品为快速适应市场,满足用户需求,其产品发布频率是极高的。

  • 渐进式发展

与传统软件产品或企业应用系统一开始就规划好全部的功能和非功能需求不同,几乎所有的大型互联网站都是从一个小网站开始,渐进地发展起来的。

根据以上总结的大型互联网应用应用特点,对大型互联网的架构,主要包括Web前端性能优化、应用服务器性能优化、存储服务器性能优化等技术方案及手段。

一、web前端



web前端性能优化主要指网站业务逻辑之前的部分,可采用的技术方案有浏览器访问优化、使用反向代理、CDN等技术。

  • 浏览器访问优化

浏览器访问主要提升在用户终端浏览器打开网页的速度,通常采用的优化技术包括减少与服务端的HTTP请求、使用浏览器本地缓存(如浏览器自身缓存、AppCache、本地数据库等)、启用压缩等技术手段对浏览器访问进行优化。

  • CDN

内容分发服务本质仍是一个缓存。其原理是将数据缓存在离用户最近的地方,使用户以最快的速度获取数据,由于CDN部署在网络运营商的机房,这些运营商又是终端用户的网络服务提供商,因此用户请求路由的第一跳就到达了CDN服务器,当CDN中存在浏览器请求的资源时,从CDN直接返回给浏览器,最短路径返回响应,加快用户访问速度,减少数据中心负载压力,CDN能够缓存的内容主要是静态资源,如图片,文件、CSS、脚本文件、静态网页,通过将这些静态资源缓存在CDN上,极大改善网页的打开速度。

  • 反向代理

反向代理的工作原理是,代理服务器来接受客户端的网络访问连接请求,然后服务器将请求有策略的转发给网络中实际工作的业务服务器,并将从业务服务器处理的结果,返回给网络上发起连接请求的客户端。反向代理的优点主要包括:

(1)提高了内部服务器的安全

来自互联网的访问请求必须经过代理服务器,相当于在Web服务器和可能的网络攻击之间建立了一个屏障。

(2)加快了对内部服务器的访问速度

代理服务器也可以通过配置缓存功能加速Web请求。当用户第一次访问静态内容的时候,静态内容就被缓存在反向代理服务器上,这样当其他用户访问该静态内容的时候,就可以直接从反向代理服务器返回,加速web请求响应速度,减轻Web服务器负载压力。

(3)实现负载均衡的功能

反向代理也可以实现负载均衡的功能,而通过负载均衡构建的应用集群可以提高系统总体处理能力,进而改善网站高并发情况下的性能。

  • 动静分离

二、应用服务器端



应用服务器性能优化的手段主要包括:分布式缓存、对应用进行微服务化拆分、异步操作等。

  • 分布式缓存

当网站遇到性能瓶颈时,第一个想到的解决方案就是使用缓存。在整个网站应用中,缓存几乎无所不在,既存在于浏览器,也存在于应用服务器和数据库服务器;既可以对数据缓存,也可以对文件缓存,还可以对页面片段缓存。合理使用缓存,对网站性能优化意义重大。

网站性能优化第一定律:优先考虑使用缓存优化性能,应用服务器侧的缓存主要指对后台数据库中的数据进行对象缓存。

缓存指将数据存储在相对较高访问速度的存储介质中,以供系统处理。一方面缓存访问速度快,可以减少数据访问的时间,另一方面如果缓存的数据是经过计算处理得到的,那么被缓存的数据无需重复计算即可直接使用,因此缓存还起到减少计算时间的作用。

缓存主要用来存放那些读写比很高、很少变化的数据,如商品的类目信息,热门词的搜索列表信息,热门商品信息等。应用程序读取数据时,先到缓存中读取,如果读取不到或数据已失效,再访问数据库,并将数据写入缓存。

分布式缓存指缓存部署在多个服务器组成的集群中,以集群方式提供缓存服务,其架构方式有两种,一种是以 JBoss Cache为代表的需要更新同步的分布式缓存,一种是以Memcached为代表的不互相通信的分布式缓存。

  • 微服务化拆分

微服务是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务于服务间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的 RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建,采用微服务架构微服务架构更灵活并且可水平伸缩。

微服务架构的特点主要包括:

1. 单一职责

微服务架构中的每个服务,都是具有业务逻辑的,符合高内聚、低耦合原则以及单一职责原则的单元,不同的服务通过“管道”的方式灵活组合,从而构建出庞大的系统。

2. 轻量级通信

服务之间通过轻量级的通信机制实现互通互联,而所谓的轻量级,通常指语言无关、平台无关的交互方式。

3. 独立性

每个服务在应用交付过程中,独立地开发、测试和部署。在单块架构中所有功能都在同一个代码库,功能的开发不具有独立性;当不同小组完成多个功能后,需要经过集成和回归测试,测试过程也不具有独立性;当测试完成后,应用被构建成一个包,如果某个功能存在 bug,将导致整个部署失败或者回滚。

在微服务架构中,每个服务都是独立的业务单元,与其他服务高度解耦,只需要改变当前服务本身,就可以完成独立的开发、测试和部署。

4. 进程隔离

单块架构中,整个系统运行在同一个进程中,当应用进行部署时,必须停掉当前正在运行的应用,部署完成后再重启进程,无法做到独立部署。

在微服务架构中,应用程序由多个服务组成,每个服务都是高度自治的独立业务实体,可以运行在独立的进程中,不同的服务能非常容易地部署到不同的主机上。

  • 异步操作

使用消息队列将调用异步化,可改善网站的扩展性,提高网站系统的性能。消息队列具有很好的削峰作用,即通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。

在不使用消息队列的情况下,用户的请求数据直接写入数据库,在高并发的情况下,会对数据库造成巨大的压力,同时也使得响应延迟加剧。在使用消息队列后,用户请求的数据发送给消息队列后立即返回,再由消息队列的消费者进程(通常情况下,该进程通常独立部署在专门的服务器集群上)从消息队列中获取数据,异步写入数据库。由于消息队列服务器处理速度远快于数据库(消息队列服务器也比数据库具有更好的伸缩性),因此用户的响应延迟可得到有效改善。

三、数据存储服务器端



  • 读写分离

高性能数据库集群的第一种方式是“读写分离”,其本质是将访问压力分散到集群中的多个节点,但是没有分散存储压力,读写分离的基本原理是将数据库读写操作分散到不同的节点上

读写分离的基本实现是:

(1)数据库服务器搭建主从集群,一主一从、一主多从都可以。

(2)数据库主机负责读写操作,从机只负责读操作。

(3)数据库主机通过复制将数据同步到从机,每台数据库服务器都存储了所有的业务数据。

(4)业务服务器将写操作发给数据库主机,将读操作发给数据库从机。

  • 分库分表

分库分表就是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)中,以达到分散单台设备负载的效果。

分库分表主要包括这四种情况:垂直分库、垂直分表、水平分表、水平分库

(1)垂直分库

垂直分库一般根据业务的耦合度,由各领域架构师自行决定,参考微服务的划分原则,理论上每个独立的部署单元应该划分成一个独立的分片。应遵循高内聚低耦合的原则,部署单元之间的交互应考虑事务一致性。

(2)垂直分表

垂直分表主要用于解决两方面的问题。

业务特性过多的问题,当业务层面无法拆分时,应考虑数据库的承载能力和效率,将数据分别存储在多个表中,常用的条件应尽量保存在一个表中,作为主驱动表,另外,因为mysql的特殊性,blob,clob等字段尽量独立建表。

动静分离问题,变更频繁的属性尽量和静态数据切分开来,例如用户信息,用户的用户名,手机号,身份证号这些基本上在录入后不会变更的数据,应该作为静态数据存储,而登录时间、登录ip等等每次登录都要改变的数据,应该作为动态数据单独存储。这样可以提高数据库的吞吐量,并且减少数据库资源的占用时间,降低冲突和死锁发生的概率。

(3)水平分表

无特殊业务需求的情况下,在数据库表里的数据超过建议负载容量区间前尽量不要做分表的操作。以MySQL为例,MySQL单表大约在2千万条记录(4G)下能够良好运行,经过数据库的优化后5千万条记录(10G)下运行良好。

(4)水平分库

无特殊业务需求的情况下,在表空间超过建议负载容量区间前,尽量做分表而不要做分库操作。

  • 使用NOSQL数据库

数据是当今世界最有价值的资产之一。在大数据时代,人们生产、收集数据的能力大大提升,但是传统的关系型数据库在可扩展性、数据模型和可用性方面已远远不能满足当前的数据处理需求,因此,各种 NoSQL 数据库系统应运而生,NoSQL 数据库基本理念是以牺牲事务机制和强一致性机制,来获取更好的分布式部署能力和横向扩展能力,创造出新的数据模型,使其在不同的应用场景下,对特定业务数据具有更强的处理性能。

NOSQL数据库主要有以下优点:

(1)灵活的数据模型

互联网数据如网站用户信息、地理位置数据、社交图谱、用户产生的内容、机器日志数据以及传感器数据等,正在快速改变着人们的通信、购物、广告、娱乐等日常生活,没有使用这些数据的应用很快就会被用户所遗忘。开发者希望使用非常灵活的数据库,容纳新的数据类型,并且不会被第三方数据提供商的数据结构变化所影响。关系型数据库的数据模型定义严格,无法快速容纳新的数据类型。例如,若要存储客户的电话号码、姓名、地址、城市等信息,则 SQL 数据库需要提前知晓要存储的是什么。这对于敏捷开发模式来说十分不方便,因为每次完成新特性时,通常都需要改变数据库的模式。NoSQL 数据库提供的数据模型则能很好地满足这种需求,各种应用可以通过这种灵活的数据模型存储数据而无须修改表;或者只需增加更多的列,无须进行数据的迁移。

(2)可伸缩性强

对企业来说,关系型数据库一开始是普遍的选择。然而,在使用关系型数据库的过程中却遇到了越来越多的问题,原因在于它们是中心化的,是纵向扩展而不是横向扩展的。这使得它们不适合那些需要简单且动态可伸缩性的应用。NoSQL 数据库从一开始就是分布式、横向扩展的,因此非常适合互联网应用分布式的特性。在互联网应用中,当数据库服务器无法满足数据存储和数据访问的需求时,只需要增加多台服务器,将用户请求分散到多台服务器上,即可减少单台服务器的性能瓶颈出现的可能性。

(3)自动分片

由于关系型数据库存储的是结构化的数据,所以通常采用纵向扩展,即单台服务器要持有整个数据库来确保可靠性与数据的持续可用性。这样做的代价是非常昂贵的,而且扩展也会受到限制。针对这种问题的解决方案就是横向扩展,即添加服务器而不是扩展单台服务器的处理能力。

NoSQL 数据库通常都支持自动分片,这意味着它们会自动地在多台服务器上分发数据,而不需要应用程序增加额外的操作。

(4)自动复制

NoSQL 数据库支持自动复制。在 NoSQL 数据库分布式集群中,服务器会自动对数据进行备份,即将一份数据复制存储在多台服务器上。因此,当多个用户访问同一数据时,可以将用户请求分散到多台服务器中。



用户头像

仲夏

关注

还未添加个人签名 2018.05.16 加入

还未添加个人简介

评论

发布
暂无评论
训练营第四周作业 1