面试官最常用小心思:说说你的项目并发量多大?负载均衡怎么做?
在开始今天的文章之前,先抛一个面试题出来:
你接触过的单机最大并发数是多少?你认为当前正常配置的服务器物理机最大并发数可以到多少?说说你的理解和分析。
如果你能很好地在心里总结一下答案,那您可以好好地享受您的周末了,就不占用您太多时间了
如果你稍微的有点迷茫,不知道怎么回答,那占用您几分钟的时间看一下下面的内容,因为这个问题可扩展性挺大哦
理想情况
理想情况下,并发量简单来说就是看源IP和源Port数量,针对单机来说,可能这个数值真的不大,但是如果你真的这么想了的话,那你可能要回炉重造了或者你没接触过实际的生产环境。
分析一下,前面的我说的是针对单个服务器或者客户端的,但是实际上每个服务器会应对全网的所有客户端,那么从服务端看,源IP和源Port的数量是非常大的。
理论上服务端可以接受的客户端IP是2^32(按照IPv4计算),端口数是2^16,这么看是真的挺大的,好像用起来可供选择的也不少,但是,开头也说了,这是理想情况呀
实际情况
天下没有免费的午餐。
每一条连接都是要消耗系统资源的,所以这个理论最大并发数是不可能达到的,在日常的开发过程中,我们一般会设置一个最大并发数来控制。
实际中并发数和业务是直接相关的,像Redis这种内存型的服务端并发十几万都是没问题的,大部分来讲几十/几百/几千/几万等是存在的。
客户端最大连接数
理解了服务器的最大并发数是2^48,那么客户端最多可以连接多少服务器这个问题该怎么回答呢?
对于客户端来说,当然可以借助于多网卡多IP来增加连接能力,我们仍然假定客户端只有1张网卡1个IP,由于端口数的限制到2^16,再去掉系统占用的端口,剩下可用的差不多64000。
也就是说,客户端的理论最大连接数是2^16,含系统占用端口。
NAT环境下的客户端
解决前面的两个问题之后,来看另外一个问题:
一个公网出口NAT服务设备最多可同时支持多少内网IP并发访问外网服务?
毕竟公网IP都是有限并且要花钱的,我们大部分机器都是在局域网中结合NAT来进行外网访问的,所以这个场景还是很熟悉的。
来看下内网机器访问外网时的IP&端口替换和映射还原的过程,就明白了:
因为这时的客户端是NAT设备,所以NAT环境下最多支持65535个并发访问外网。
怎么样,看完上面的内容不知道大家对于刚开始的几道问题的回答是否清楚了呢?但是,我也说了,这道题有点意思,并发量的增大,对应的就是解决方案,这里因为篇幅原因,也没有办法讲解太多,就说一个最常用的吧——Nginx
Nginx负载均衡、限流、缓存、黑白名单
一、静态代理
Nginx擅长处理静态文件,是非常好的图片、文件服务器。把所有的静态资源的放到nginx上,可以使应用动静分离,性能更好。
二、负载均衡
Nginx通过反向代理可以实现服务的负载均衡,避免了服务器单节点故障,把请求按照一定的策略转发到不同的服务器上,达到负载的效果。常用的负载均衡策略有,
1、轮询
将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
2、加权轮询
不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
3、ip_hash(源地址哈希法)
根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客户端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
4、随机
通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。
5、least_conn(最小连接数法)
由于后端服务器的配置不尽相同,对于请求的处理有快有慢,最小连接数法根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。
三、限流
Nginx的限流模块,是基于漏洞算法实现的,在高并发的场景下非常实用。
1、配置参数
1)limit_req_zone定义在http块中,$binary_remote_addr 表示保存客户端IP地址的二进制形式。
2)Zone定义IP状态及URL访问频率的共享内存区域。zone=keyword标识区域的名字,以及冒号后面跟区域大小。16000个IP地址的状态信息约1MB,所以示例中区域可以存储160000个IP地址。
3)Rate定义最大请求速率。示例中速率不能超过每秒100个请求。
2、设置限流
burst排队大小,nodelay不限制单个请求间的时间。
四、缓存
1、浏览器缓存,静态资源缓存用expire。
2、代理层缓存
五、黑白名单
1、不限流白名单
2、黑名单
上面就是nginx几个常用功能,动静分离、负载均衡、限流、缓存、黑白名单等,你都了解了吗,不了解的话还可以关注我等待后续更新nginx深入知识哦(没办法,我试过,因为篇幅原因,附完整得知识讲解,太多了,不好意思各位,看我下次分享)。
个人公众号:Java架构师联盟,每日更新技术好文
版权声明: 本文为 InfoQ 作者【小Q】的原创文章。
原文链接:【http://xie.infoq.cn/article/d5b15ac1bac91f2832399c836】。
本文遵守【CC BY-NC-ND】协议,转载请保留原文出处及本版权声明。
评论