通常情况下,一个网站的架构出来功能性需求外,还应该考量以下五个方面:
性能
可用性
伸缩性
扩展性
安全性
性能
性能的官方解释,我就不说了。对用户来说,就是系统的反应速度是否快。
对网站来说,性能问题是无处不在的,继而,我们优化性能的手段也有很多。
我们从前到后一个一个来说
在浏览器端,可以通过浏览器缓存,页面压缩,合理布局页面等方式
还可以使用cdn,让一些静态文件放在网络服务商的机房,这样离用户近一些。
也可以使用反向代理,把静态文件存在反向代理服务器上,例如apache
服务器端就是缓存了,有本地缓存,分布式缓存两种形式
再有就是异步,集群
以上为服务器级别的手段
在代码层次,可以使用多线程以充分发挥多核的优势
数据库层次,索引,缓存,sql优化等等已经又数据库服务商为我们做好了。
网站的性能指标包括
响应时间(这个好理解)
TPS(Transaction Per Second) 每秒钟系统能够处理的交易或事务的数量
就我个人的理解,对应性能的优化,应该先测试,要明白系统到底是哪里慢,哪里才是系统的瓶颈。优化的时候要有的放矢,不能事倍功半。
关于性能的分析与测试下一节我们再说
可用性
这个也比较好理解,可用就是说,系统作为一个整体可对外提供服务。
因为要维护代码,增加新的应用或者硬件问题,断电等等,没有哪一件网站能做到7x24小时可用。
但是,我们要尽力的做到高可用。
高可用的手段主要就是冗余。一个硬件能干的事,我用n(n>1)个。
应用服务器使用n个,采用负载均衡,一台坏了还有n-1台。当然负载均衡这个东西,也可以部署2套。
对应数据库而已,一般就是实时备份。
衡量一个系统的架构设计是否满足高可用的目标,就是假设系统中任何一台或者多台服务器宕机时,或者出现别的不可预期的问题时,系统整体是否依然可用。
伸缩性
我们已经知道,在当前的实践中,网站是使用多台服务器组成一个整体来对外提供服务(可用是应用服务,也可以是存储服务,当然还可以是计算服务等等)的。
衡量伸缩性的标准就是时候可以采用多台服务器构建集群,是否可以(容易)向系统里增加更多的服务器来提高系统的服务能力,集群中的总的服务器数量是否有限。
服务器主要有三种,应用服务器,缓存服务器,数据库服务器。
对于应用服务器来说,只有里面没有保存数据,那么所有的服务器都是对等的,只要有合适的负载均衡策略,我们就可以不断的增加应用服务器。
缓存服务器,(如果应用已经严重依赖缓存了)这里的主要矛盾是要改进缓存的路由算法(否则,会路由失效)
数据库要直接增加硬件来扩充服务比较麻烦,所以在这里我们主要的策略通过路由分区把多个部署有数据库的服务器组成集群。
NoSQL本身就是为大数据而产生的,伸缩性都比较好。
扩展性
伸缩性与扩展性就字面意义来说,似乎很接近
其实扩展性,就是指,对现有的系统增加一个新的模块,是否可以实现对现有模块的透明无影响,不需要或者很少改动现有的代码就能上线新模块,不同产品之间是否很少耦合,一个产品改动了对别的产品没影响。
要实现扩展性,主要由两个手段1 事件驱动 2 分布式服务(其实说白了,要解耦,就是这两个方式)
事件驱动就是指在系统中引入消息队列
分布式服务是将业务主体和可以复用的服务分开。新增的产品可以调用那些可复用的服务来实现自身的逻辑。
安全性
不受恶意访问和攻击,重要数据不被窃取。
思维导图