软件设计一方面是功能设计,一方面是架构设计。功能设计主要就是满足软件需要提供的功能,支撑的服务。比如Nginx是一款Web服务器,那么他的功能就必须满足Web传输协议的各种约束,实现Web服务具有的各种功能。架构设计主要是解决如何提高更高效的服务,如何更低成本的维护,如何让服务更稳定健硕这些问题。他有一系列的规则和约束,本文旨在梳理Nginx服务器在架构设计方面(基本上也是软件设计方面)需要满足的各种约束和规则,以便在后续学习中能结合这些规则更好的体会Nginx在架构设计方面的出彩之处。
1.性能
Web服务器的主体性能体现在三个方面;网络性能(吞吐量),单次请求的延迟性(响应时效),网络效率(信息量)。简单都说就是希望web服务器能支撑的请求更数量高,响应的时间更短,传递的信息更多。
2.可伸缩性
可伸缩性指系统功能提供服务的难易程度。包括组件的复杂度,耦合度,交互方式,加载方式等条件制约。常规方法中的接口化,模块化,动态加载,异步处理等方式都可以很好的提高系统的可伸缩性。
3.简单性
简单是组件本身的简单程度,每个组件越简单就会越容易理解和实现,也越容易被验证。常规措施,我们通过分离关注点原则(我称之为单一功能原则,就是一个组件只干一件事,干好了就行)来设计组件。在整体架构上使用统一接口原则,比如Nginx中的模块化。
4.可修改性
可修改性是在当前架构下系统变更的难易程度,对于Web服务器而言最常见的就是热部署,在不停机的情况下,更新修复功能。可修改性分开理解可以包括可进化性,可扩展性,可定制性,可配置性和可重用性。
5.可见性
可见性指系统运行状态可监控。例如网络连接数,CPU使用情况,缓存使用情况,请求处理时效,请求成功率(可靠性)等
6.可移植性
也即系统平台兼容性,是指软件在不做修改的情况下跨平台运行能力。
7.可靠性
可靠性是系统出现系统层面故障影响后提供可靠不间断服务能力。可以通过避免单点故障,冗余部署,实时监控等方式来缩小故障范围。
Nginx在架构设计中格外重视这7个关键点,参照这7个关键点可以更好的理解Nginx在架构中的机巧。