服务接入层小结
接入层
是指普通用户与核心业务逻辑中间的过程。现在常见的服务接入层,像nginx、lvs、php这些都可以算是。
观点
一种观点认为:接入的量不应该影响系统的正常运行,也就是不能接入不能处理的用户请求,类似上图中前图。
另一种观点认为:接入层应该尽量接入所有用户,类似上图中后图。
做法
nginx:
nginx如果用做proxy,后端挂其他服务的话,是一个纯粹的NIO server。对用户来说,nginx是长连接(http 1.1),对后端服务来说,nginx是短连接(http 1.0)。
default: proxy_connect_timeout 60s; 向后端服务创建连接的超时时间
default: proxy_read_timeout 60s; 后端返回请求响应超时时间
default: proxy_send_timeout 60s; 大请求发到后端超时时间
nginx通过上面的三个设置,当后端有响应不过来的时候,进行超时处理(记录日志),当发现超时很多了,就需要提升后端的处理能力了。
那么,nginx自身的处理能力是否有上限呢?当然有!
worker_processes 1;
worker_connections 1024;
max_clients = worker_processes * worker_connections
当超过max_clients的用户扑上来的时候,如果幸运后端没有能力问题,那就会看到nginx在日志中要求你增加worker的提示。
php-fpm:
pm = dynamic/static; dynamic时有最大进程最小进程之说,static时没有。只有一个上限。
pm.max_children = 50;强制的一个阀门,后面的设置里,进程数不能大于这个。
pm.start_servers = 20;启动时启动的fastcgi进程。
pm.min_spare_servers = 5;最小fastcgi进程数量,dynamic有效
pm.max_spare_servers = 35;最大fastcgi进程数量,dynamic有效
php没有异步进程概念,如果要使用php作为接入层,需要自己完成NIO扩大接入能力(接触到的ICE、thrift在php中都是同步操作)。而接入能力就取决于上面的配置。
java:
java优秀的NIO框架netty。
servlet3.0实现了异步请求的context,目前还没有在平常框架中进行使用。一般的用法为comet push server,性能未知。
一般来说,用java做接入层很容易变成了业务层。(但是,为什么不呢?)
tomcat 7.0.x提供了servlet3.0的这一特性,CometProcessor interface。
resin 4.x提供了servlet3.0的这一特性,GenericCometServlet。
从名字看,大家都一致性地认为这一特性适合用来做comet server。(理论上可接入无限用户,直到费尽cpu、内存,服务器死机、jvm oom)
想快点找到作者也可以到Twitter上留言: @54chen
或者你懒得带梯子上墙,请到新浪微博:@54chen
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:54chen 来源: 五四陈科学院-坚信科学,分享技术
- 标签: 服务接入层
- 发布时间:2012-01-24 13:41:14
- [537] 如何拿下简短的域名
- [536] WEB系统需要关注的一些点
- [15] 什么是DNS劫持和DNS污染?
- [13] Zookeeper工作原理
- [11] 基于SSD的数据库性能优化
- [11] 一致性哈希算法及其在分布式系统中的应用
- [11] 大并发下的高性能编程 – 改进的(用户态)自
- [11] 使用DNSPOD的API实现动态域名
- [11] Python中的闭包
- [11] 行进在产品经理的路上