有关I/O多路复用的总结

什么是IO多路复用呢?

IO多路复用的实现有哪些呢?

它们的区别是什么呢?

为了回答上面三个问题,我总结得到了这篇文章。

Redis常见面试题总结

1. Redis为什么这么快?

  1. 完全基于内存,绝大部分请求是纯粹的内存操作,执行效率非常高。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
  2. 数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
  3. 采用单线程(该单线程指的是处理网络请求的线程),避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
  4. 使用多路I/O复用模型,非阻塞IO;

《大型网站技术架构》读书笔记——第1篇 概述

1. 大型网站架构演化

1.1 大型网站软件系统的特点

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

1.2 大型网站架构演化发展历程

  1. 初始阶段,应用程序、数据库、文件等资源都在同一台服务器上,通常是LPAM(Linux,PHP,Apache,MySQL)。


  1. 应用服务和数据服务分离,随着业务的发展一台服务器已经不能满足需求了,这时候就将数据服务分离出来了。


  1. 使用缓存改善网站性能,通常网站的访问遵循二八定律,大部分的业务访问集中在小部分数据上,那么缓存这部分数据就可以减轻服务器的压力,从而提高访问速度。缓存分为两种:本地缓存和远程分布式缓存。


  1. 使用应用服务器集群改善网站的并发处理能力,应用服务器利用集群来实现网站的可伸缩性,一般通过负载均衡调度服务器来将集群中加入更多的应用服务器。



  2. 数据库的读写分离,使用缓存并不能满足更多的用户规模,数据库会因为负载过大成为网站性能的瓶颈。目前主流的数据库都提供主从热备功能,通过主从复制来实现数据库的读写分离。



  3. 使用反向代理和CDN加速网站响应,反向代理和CDN的原理都是缓存,区别在于CDN部署在网络提供商的机房,根据地理位置来获取数据;而反向代理则部署在网站的中心机房,当请求达到中心机房的时候首先访问反向代理。



  1. 使用分布式文件系统和分布式数据系统,随着业务需求的持续增长,文件系统也不能满足需求了。分布式数据库是网站数据库拆分的最后手段,只能有不得已的情况下,才将大表拆分,通常的手段是业务分库,即将不同业务的数据部署在不同的物理机上。



  2. 使用NoSQL和搜索引擎,对于数据存储和检索的需求越发复杂,NoSQL和搜索引擎有着更好的可伸缩的分布式特性。



  3. 业务拆分,对了应对日益复杂的业务场景,通过分而治之的手段,将整个网站业务拆分成不同的产品线,分别由不同的业务团队负责。应用之间可以通过一个超链接建立关系,还可以使用消息队列进行数据分发,最多的是通过访问同一个数据存储系统来构成一个关联的完整系统。



  4. 分布式服务,随着业务拆分越来越小,部署维护难度增大。既然每一个应用系统都需要执行许多相同的操作,那么可以将这些共有的业务提取出来,独立部署。



2. 大型网站架构模式

模式,来自建筑学的定义“每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复工作”。关键在于问题和场景的可重复性带来的解决方案的可重复性

2.1 网站架构模式

  • 分层:通过分层,可以将一个庞大的系统分成不同的部分,便于分工合作与维护;各层之间具有一定的独立性,只要维护调用接口不变,各层可以根据具体问题具体分析。分层通常都是逻辑上的,部署上可以在同一台物理机上也可以分离部署。
  • 分割:分割是对软件的纵向切分,将不同的功能和服务分割开,有助于开发和维护也提高了网站的并发处理能力和功能拓展性。例如,在应用层对不同业务进行分割,分成购物、论坛、搜索、广告等。
  • 分布式:分层和分割都是为了方便分布式部署,即将不同模块部署在不同的服务器上,通过远程调用协作。分布式同样带来一些问题,网络对于性能的影响,服务器宕机的威胁,数据一致性等问题。常用的分布式方案有:
    • 分布式应用和服务:将分层和分割后的应用按照模块分布式部署;
    • 分布式静态资源:动静分离的策略,减轻服务器负载和加快加载速度;
    • 分布式数据和存储:海量数据,单个机器已经无法存储,只有利用分布式存储;
    • 分布式计算:加快数据处理的速度
  • 集群:多台服务器部署相同应用构成一个集群,通过负载均衡设备共同对外提供服务;
  • 缓存:将数据存放在距离计算最近的位置以加快处理速度,缓存是改善软件性能的第一手段。
    • CDN:内容分发网络,部署在距离客户端最近的网络服务商,用户的网络请求总是先到达他的网络服务商那里,在这里缓存网站的一些静态资源。
    • 反向代理:属于网站前端架构的一部分,部署在网站的前端,当用户请求达到网络的数据中心的时候,最先访问反向代理,这里会缓存网站的静态资源。
    • 本地缓存:应用服务器本地缓存着一些热点数据,直接可以在本机内存中访问数据,无需访问数据库。
    • 分布式缓存:缓存所需的空间太大,单机不能承受,会存放在一个专门的分布式缓存集群。
  • 异步:通过异步来给系统解耦,异步构架是典型的生产者-消费者模式。
  • 冗余:为了应对服务器的宕机,应当保持服务器的一定冗余,实现高可用。数据库利用定期备份存档,实现冷备份;利用主从分离,实现热备份
  • 自动化:目前主要集中在发布运维方面
  • 安全:通过密码和手机验证码进行身份认证;登录、交易等操作需要对网络通信进行加密;为了防止机器人程序滥用网络资源攻击网站,使用验证码识别;对于XSS攻击、SQL注入等常见攻击进行相应处理;对交易转账等重要操作根据交易模式和交易信息进行风险控制。

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

架构,即“最高层次的规划,难以改变的决定”

软件架构,即“有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计”。系统的各个重要部分及其关系构成了系统的架构,这些组成部分可以是具体的功能模块,也可以是非功能的设计与决策,它们相关的关系组成一个整体,共同构成了软件系统的架构。

系统架构需要关注性能、可用性、伸缩性、扩展性和安全性这5个架构要素来衡量一个软件架构设计的优劣。

3.1 性能

优化网站性能的手段非常多,从用户浏览器到数据库,影响用户请求的所有环节都可以进行性能优化。

在浏览器端,可以通过浏览器缓存、使用页面压缩、合理布局页面、减少Cookie传输等改善性能。

在应用服务器端,可以使用服务器本地缓存和分布式缓存,通过缓存在内存中的热点数据处理用户请求,加快请求处理过程,降低数据库负载。

可使用CDN,将网站静态内容分发到离用户最近的网络服务商机房;在网站机房部署反向代理服务器,缓存热点数据,加快请求响应速度,减轻数据库压力。

可通过异步操作将用户请求发送至消息队列后直接返回响应给用户。

可以将多台应用服务器组成一个集群共同对外服务,提高整体处理能力,优化性能。

在代码层面,使用多线程、改善内存管理等手段优化性能。

在数据库上,使用索引、缓存、SQL优化等改善性能。

衡量性能有一系列指标,重要的有响应时间、TPS、系统性能计数器等。

3.2 可用性

高可用设计的目标是当服务器宕机的时候,服务或者应用依然可用。

主要手段是冗余,对于应用服务器来说,任何一台机器宕机,通过负载均衡都可以将请求切换到其他服务器上实现高可用,前提条件是在应用服务器上不能保存请求的会话信息。

对于存储服务器来说,需要对数据进行实时备份,当服务器宕机的时候切换服务器进行数据恢复可以保证宕机时候的数据依然可用。

网站的高可用还需要软件开发过程的质量保证。通过预发布验证、自动化测试、自动化发布、灰度发布等手段,减少将故障引入线上环境的可能。

衡量高可用的标准是,假设系统中任何一台或多台服务器宕机以及各种不可预期的问题的时候,系统整体是否依然可用。

3.3 伸缩性

伸缩性,即通过不断向集群加入服务器的手段来环节不断上身用户并发访问压力和不断增长的数据存储需求。

对于应用服务器集群,只要服务器上不保存数据,所以服务器都是对等的,通过使用合适的负载均衡设备就可以向集群中不断加入服务器。

对于缓存服务器集群,加入新的服务器可能会导致缓存路由失效,进而导致集群中大部分缓存数据都无法访问。需要改进缓存路由算法来保证缓存数据的可访问性。

关系型数据难以做到大规模集群的可伸缩性,一般通过路由分区等手段将部署有多个数据库的服务器组成一个集群。

3.4 扩展性

扩展性是直接关注网站的功能需求,主要标准是在网站增加新的业务产品时,是否可以实现对现有产品透明无影响,不需要任何改动或者很少改动既有业务功能就可以上线新产品。

主要手段是事件驱动构架和分布式服务。事件驱动架构通常由消息队列实现,将用户和其他业务事件造成的消息发布到消息队列,消息的处理者作为消费者从消息队列中获取消息进行处理。通过这种方式将消息的产生和处理分离,可以透明地增加新消息的生产者或者新消息的消费者。

分布式服务则是由将业务和可复用服务分离开,通过分布式服务框架调用。新增产品可以通过调用复用的服务实现自身的业务逻辑;可复用服务升级变更后,也可以通过提供多版本服务对应用实现透明升级。

通常大型网站会吸引第三方开发者,调用网站服务,其主要途径就是大型网站提供的开放平台接口。

3.5 安全性

安全性,即保护网站不受恶意访问和攻击,保护网站的重要数据不被窃取。

其衡量标准就是针对现存和潜在的各种攻击与窃密手段,是否有可靠的应对策略。