论文部分内容阅读
摘要:当前基于Node的Web应用得到了广泛的关注和应用,但这类应用增长速度之快,導致的产品化性能问题往往容易被忽视。本文主要通过动静分离、启用缓存、多进程架构、读写分离四个方面来说明如何针对基于Node的Web应用作性能提升。
关键词:Node;产品化;性能优化
1 引言
对于基于Node的Web应用而言,最直接有效的提升性能的方法莫过于动静分离、启用缓存、多进程架构和读写分离。一般地,提升性能遵循的原则可以拆分为:做专一的事;让擅长的工具做擅长的事情;将模型简化;将风险分离。
2 性能提升方法
2.1 动静分离
在普通的Web应用中,Node尽管也能通过中间件来实现静态文件服务,但是Node处理静态文件的能力并不算突出。因此,在Node应用中通常是将发往服务器的请求分为两种:一种是动态服务请求,一种是静态文件请求。将动态服务请求和静态文件请求分离后,Node服务器可以专注在动态服务方面,而对于图片、脚本、样式表和多媒体等静态文件都引导到专业的静态文件服务器上,如Nginx或者专业的CDN,由它们来处理这个过程,就符合了“让擅长的工具做擅长的事情”这一原则。同时,专业的CDN会将静态文件与用户尽可能地靠近,并能够提供更精确和高效的缓存机制。静态文件请求分离后,对静态请求使用不同的域名或多个域名还能消除掉不必要的Cookie传输和浏览器对下载线程数的限制。
静态文件请求和动态服务请求分离只是最简单的分离,也比较容易实现。事实上还有更复杂的情况,比如一个网页中同时存在动态数据和静态内容,在Node中将内容发送至客户端时需要进行字符串到Buffer的转换,但是对于静态内容而言无须进行字符串层级的替换,只要保留成Buffer即可。直接进行Buffer传输可以很大程度上提升性能。是故能够在动态内容中再将动态内容和静态内容分离,还能进一步提升性能,但这种程度上的控制没有普适性,需要较多的细节处理。
2.2 启用缓存
提升性能其实差不多只有两个途径,一是提升服务的速度,二是避免不必要的计算。前者提升的性能在海量流量面前终有瓶颈,但后者却能够在访问量越大时收益越多。避免不必要的计算,应用场景最多的就是缓存。
尽管同步I/O在CPU等待时浪费的时间较为严重,但是在缓存的帮助下,却能够消减同步I/O带来的时间浪费。但不管是同步I/O还是异步I/O,避免不必要的计算这条原则如果遵循得较好,性能提升是显著的。
如今,Redis或Memcached几乎是Web应用的标准配置。如果产品需要应对巨大的流量,启用缓存并应用好它,是突破系统性能瓶颈的关键。
2.3 多进程架构
通过多进程架构,不仅可以充分利用多核CPU,更是可以建立机制让Node进程更加健壮,以保障Web应用持续服务。由于Node是通过自由模块构建HTTP服务器的,不像大多数服务器端技术那样有专有的Web容器,所以需要开发者自己处理多进程的管理。不过在官方已经有cluster模块,在社区也有pm、forever、pm2这样的模块用于进程管理。
2.4 读写分离
除了动静分离外,另一个较为重要的分离是读写分离,这主要针对数據库而言。就任意数据库而言,读取的速度远远高于写入的速度。而某些数据库在写入时为了保证数据一致性,会进行锁表操作,这同时会影响到读取的速度。某些系统为了提升性能,通常会进行数据库的读写分离,将数据库进行主从设计,主数据库提供写操作,从数据库提供读操作,这样读数据操作不再受到写入的影响,有效地减轻了数据库的压力,也能减轻io压力。
3 总结
通过本文描述的这些提升性能的方式,能帮助优化基于Node的Web应用,使得应用更加高效、健壮。
关键词:Node;产品化;性能优化
1 引言
对于基于Node的Web应用而言,最直接有效的提升性能的方法莫过于动静分离、启用缓存、多进程架构和读写分离。一般地,提升性能遵循的原则可以拆分为:做专一的事;让擅长的工具做擅长的事情;将模型简化;将风险分离。
2 性能提升方法
2.1 动静分离
在普通的Web应用中,Node尽管也能通过中间件来实现静态文件服务,但是Node处理静态文件的能力并不算突出。因此,在Node应用中通常是将发往服务器的请求分为两种:一种是动态服务请求,一种是静态文件请求。将动态服务请求和静态文件请求分离后,Node服务器可以专注在动态服务方面,而对于图片、脚本、样式表和多媒体等静态文件都引导到专业的静态文件服务器上,如Nginx或者专业的CDN,由它们来处理这个过程,就符合了“让擅长的工具做擅长的事情”这一原则。同时,专业的CDN会将静态文件与用户尽可能地靠近,并能够提供更精确和高效的缓存机制。静态文件请求分离后,对静态请求使用不同的域名或多个域名还能消除掉不必要的Cookie传输和浏览器对下载线程数的限制。
静态文件请求和动态服务请求分离只是最简单的分离,也比较容易实现。事实上还有更复杂的情况,比如一个网页中同时存在动态数据和静态内容,在Node中将内容发送至客户端时需要进行字符串到Buffer的转换,但是对于静态内容而言无须进行字符串层级的替换,只要保留成Buffer即可。直接进行Buffer传输可以很大程度上提升性能。是故能够在动态内容中再将动态内容和静态内容分离,还能进一步提升性能,但这种程度上的控制没有普适性,需要较多的细节处理。
2.2 启用缓存
提升性能其实差不多只有两个途径,一是提升服务的速度,二是避免不必要的计算。前者提升的性能在海量流量面前终有瓶颈,但后者却能够在访问量越大时收益越多。避免不必要的计算,应用场景最多的就是缓存。
尽管同步I/O在CPU等待时浪费的时间较为严重,但是在缓存的帮助下,却能够消减同步I/O带来的时间浪费。但不管是同步I/O还是异步I/O,避免不必要的计算这条原则如果遵循得较好,性能提升是显著的。
如今,Redis或Memcached几乎是Web应用的标准配置。如果产品需要应对巨大的流量,启用缓存并应用好它,是突破系统性能瓶颈的关键。
2.3 多进程架构
通过多进程架构,不仅可以充分利用多核CPU,更是可以建立机制让Node进程更加健壮,以保障Web应用持续服务。由于Node是通过自由模块构建HTTP服务器的,不像大多数服务器端技术那样有专有的Web容器,所以需要开发者自己处理多进程的管理。不过在官方已经有cluster模块,在社区也有pm、forever、pm2这样的模块用于进程管理。
2.4 读写分离
除了动静分离外,另一个较为重要的分离是读写分离,这主要针对数據库而言。就任意数据库而言,读取的速度远远高于写入的速度。而某些数据库在写入时为了保证数据一致性,会进行锁表操作,这同时会影响到读取的速度。某些系统为了提升性能,通常会进行数据库的读写分离,将数据库进行主从设计,主数据库提供写操作,从数据库提供读操作,这样读数据操作不再受到写入的影响,有效地减轻了数据库的压力,也能减轻io压力。
3 总结
通过本文描述的这些提升性能的方式,能帮助优化基于Node的Web应用,使得应用更加高效、健壮。