什么是IO多路复用呢?
IO多路复用的实现有哪些呢?
它们的区别是什么呢?
为了回答上面三个问题,我总结得到了这篇文章。
使用应用服务器集群改善网站的并发处理能力,应用服务器利用集群来实现网站的可伸缩性,一般通过负载均衡调度服务器来将集群中加入更多的应用服务器。
数据库的读写分离,使用缓存并不能满足更多的用户规模,数据库会因为负载过大成为网站性能的瓶颈。目前主流的数据库都提供主从热备功能,通过主从复制来实现数据库的读写分离。
使用反向代理和CDN加速网站响应,反向代理和CDN的原理都是缓存,区别在于CDN部署在网络提供商的机房,根据地理位置来获取数据;而反向代理则部署在网站的中心机房,当请求达到中心机房的时候首先访问反向代理。
使用分布式文件系统和分布式数据系统,随着业务需求的持续增长,文件系统也不能满足需求了。分布式数据库是网站数据库拆分的最后手段,只能有不得已的情况下,才将大表拆分,通常的手段是业务分库,即将不同业务的数据部署在不同的物理机上。
使用NoSQL和搜索引擎,对于数据存储和检索的需求越发复杂,NoSQL和搜索引擎有着更好的可伸缩的分布式特性。
业务拆分,对了应对日益复杂的业务场景,通过分而治之的手段,将整个网站业务拆分成不同的产品线,分别由不同的业务团队负责。应用之间可以通过一个超链接建立关系,还可以使用消息队列进行数据分发,最多的是通过访问同一个数据存储系统来构成一个关联的完整系统。
分布式服务,随着业务拆分越来越小,部署维护难度增大。既然每一个应用系统都需要执行许多相同的操作,那么可以将这些共有的业务提取出来,独立部署。
模式,来自建筑学的定义“每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复工作”。关键在于问题和场景的可重复性带来的解决方案的可重复性。
架构,即“最高层次的规划,难以改变的决定”。
软件架构,即“有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计”。系统的各个重要部分及其关系构成了系统的架构,这些组成部分可以是具体的功能模块,也可以是非功能的设计与决策,它们相关的关系组成一个整体,共同构成了软件系统的架构。
系统架构需要关注性能、可用性、伸缩性、扩展性和安全性这5个架构要素来衡量一个软件架构设计的优劣。
优化网站性能的手段非常多,从用户浏览器到数据库,影响用户请求的所有环节都可以进行性能优化。
在浏览器端,可以通过浏览器缓存、使用页面压缩、合理布局页面、减少Cookie传输等改善性能。
在应用服务器端,可以使用服务器本地缓存和分布式缓存,通过缓存在内存中的热点数据处理用户请求,加快请求处理过程,降低数据库负载。
可使用CDN,将网站静态内容分发到离用户最近的网络服务商机房;在网站机房部署反向代理服务器,缓存热点数据,加快请求响应速度,减轻数据库压力。
可通过异步操作将用户请求发送至消息队列后直接返回响应给用户。
可以将多台应用服务器组成一个集群共同对外服务,提高整体处理能力,优化性能。
在代码层面,使用多线程、改善内存管理等手段优化性能。
在数据库上,使用索引、缓存、SQL优化等改善性能。
衡量性能有一系列指标,重要的有响应时间、TPS、系统性能计数器等。
高可用设计的目标是当服务器宕机的时候,服务或者应用依然可用。
主要手段是冗余,对于应用服务器来说,任何一台机器宕机,通过负载均衡都可以将请求切换到其他服务器上实现高可用,前提条件是在应用服务器上不能保存请求的会话信息。
对于存储服务器来说,需要对数据进行实时备份,当服务器宕机的时候切换服务器进行数据恢复可以保证宕机时候的数据依然可用。
网站的高可用还需要软件开发过程的质量保证。通过预发布验证、自动化测试、自动化发布、灰度发布等手段,减少将故障引入线上环境的可能。
衡量高可用的标准是,假设系统中任何一台或多台服务器宕机以及各种不可预期的问题的时候,系统整体是否依然可用。
伸缩性,即通过不断向集群加入服务器的手段来环节不断上身用户并发访问压力和不断增长的数据存储需求。
对于应用服务器集群,只要服务器上不保存数据,所以服务器都是对等的,通过使用合适的负载均衡设备就可以向集群中不断加入服务器。
对于缓存服务器集群,加入新的服务器可能会导致缓存路由失效,进而导致集群中大部分缓存数据都无法访问。需要改进缓存路由算法来保证缓存数据的可访问性。
关系型数据难以做到大规模集群的可伸缩性,一般通过路由分区等手段将部署有多个数据库的服务器组成一个集群。
扩展性是直接关注网站的功能需求,主要标准是在网站增加新的业务产品时,是否可以实现对现有产品透明无影响,不需要任何改动或者很少改动既有业务功能就可以上线新产品。
主要手段是事件驱动构架和分布式服务。事件驱动架构通常由消息队列实现,将用户和其他业务事件造成的消息发布到消息队列,消息的处理者作为消费者从消息队列中获取消息进行处理。通过这种方式将消息的产生和处理分离,可以透明地增加新消息的生产者或者新消息的消费者。
分布式服务则是由将业务和可复用服务分离开,通过分布式服务框架调用。新增产品可以通过调用复用的服务实现自身的业务逻辑;可复用服务升级变更后,也可以通过提供多版本服务对应用实现透明升级。
通常大型网站会吸引第三方开发者,调用网站服务,其主要途径就是大型网站提供的开放平台接口。
安全性,即保护网站不受恶意访问和攻击,保护网站的重要数据不被窃取。
其衡量标准就是针对现存和潜在的各种攻击与窃密手段,是否有可靠的应对策略。