开始今天的文章之前,抛出一个面试题:你接触过的单机最大并发数是多少?你觉得目前配置的服务器物理机最大并发能达到多少?谈谈你的理解和分析。如果你能在脑海中很好地总结出答案,那么你就可以享受你的周末,也不会占用你太多的时间。如果你有点迷茫,不知道如何回答,那么这将花费你几分钟的时间看看下面的内容,因为这个问题的可扩展性很强。理想情况下,在理想的情况下,并发量只取决于源IP和源端口的数量。对于单台机器来说,这个价值可能真的不大,但是如果你真的这么想,那么你可能要回炉改造或者你从来没有接触过实际的生产环境。分析一下,我上面说的是针对单个服务器或者客户端,但实际上每个服务器都会处理整个网络中的所有客户端,所以从服务器的角度来看,源IP和源端口的数量是非常大的。理论上,服务端可以接受的客户端IP为2^32(按IPv4计算),端口数为2^16。看起来真的很大,而且好像有很多使用的选择。不过,一开始我也说过,这是一个理想的情况。事实上,世界上没有免费的午餐。每个连接都会消耗系统资源,所以理论上的最大并发是不可能达到的。在日常的开发过程中,我们一般会设置一个最大并发数来进行控制。实际上,并发数与业务直接相关。像Redis这种基于内存的服务器,10万以上的并发是没有问题的。客户端的最大连接数理解为服务端的最大并发数是2^48,那么如何回答客户端最多可以连接多少台服务器的问题呢?对于客户端来说,当然可以使用多网卡、多IP来增加连接能力。我们仍然假设客户端只有一张网卡和一个IP。由于端口数限制在2^16,再去掉系统占用的端口,剩下差不多64000个可用。也就是说,客户端理论上最大连接数是2^16,包括系统占用的端口。NAT环境下的客户端解决了前面两个问题之后,我们再来看另一个问题:一个公网出口NAT服务设备,最多可以同时访问多少个内网IP同时访问外网服务?毕竟公网IP有限,而且要花钱。我们的机器大部分都是在局域网中使用NAT访问外网,所以这个场景还是很熟悉的。看一下内网机器访问外网时IP&端口替换和映射恢复的过程,你就会明白:因为此时客户端是NAT设备,NAT环境最多支持65535并发访问外网.怎么样,看完上面的内容,不知道大家对前几个问题的答案是否清楚了呢?不过,我也说了这个问题有点意思。并发量的增加对应解决方案。限于篇幅,这里没办法过多解释。说说最常用的一个——NginxNginx负载均衡、限流、缓存、黑白名单1.静态代理Nginx擅长处理静态文件,是一款非常优秀的图片和文件服务器。把所有的静态资源都放在nginx上,可以让应用动静分离,性能更好。2、负载均衡Nginx可以通过反向代理实现服务的负载均衡,避免服务器单节点故障,将请求按照一定的策略转发到不同的服务器,达到负载的效果。常用的负载均衡策略有:1.轮询将请求按顺序轮流分发到后端服务器,它均衡地对待每台后端服务器,不考虑服务器的实际连接数和当前系统负载。2、加权轮询不同的后端服务器可能机器配置不同,当前系统负载不同,因此其抗压能力也不同。给配置高、负载低的机器分配更高的权重,让它们处理更多的请求;给配置低、负载高的机器分配较低的权重,以降低其系统负载,加权轮询效果很好妥善处理这个问题,将请求按权重顺序分配给后端。3、ip_hash(源地址哈希法)根据得到的客户端IP地址通过哈希函数计算出一个值,用这个值对服务器列表的大小进行取模运算,得到的结果就是个数客户端想要访问服务器序列号的次数。源地址散列法用于负载均衡。对于IP地址相同的客户端,在后端服务器列表不变的情况下,每次都会映射到同一台后端服务器进行访问。4、随机使用系统的随机算法,根据后端服务器的listsize值,随机选择其中一台服务器进行访问。5.least_conn(最小连接数法)由于后端服务器的配置不同,请求的处理可能快也可能慢。最小连接数法根据后端服务器当前连接状态,动态选择当前积压最少的单个服务器来处理当前请求,尽可能提高后端服务的利用效率,并将负责合理拆分到各个服务器。3、限流Nginx的限流模块是基于漏洞算法实现的,在高并发场景下非常实用。1、配置参数1)limit_req_zone定义在http块中,$binary_remote_addr表示保存客户端IP地址的二进制形式。2)Zone定义了IP状态和URL访问频率的共享内存区域。zone=keyword标识区域名称,冒号后跟区域大小。16000个IP地址的状态信息约1MB,所以例子中的region可以存储160000个IP地址。3)Rate定义最大请求速率。示例速率不能超过每秒100个请求。2.设置限流突发队列大小,nodelay不限制单个请求之间的时间。四、缓存1、浏览器缓存,带过期的静态资源缓存。2.代理层缓存5.黑白名单1.不限流白名单2.黑名单以上是nginx的几个常用功能,动静分离,负载均衡,限流,缓存,黑白名单等。你到底懂不懂呢?没有懂的可以关注我,等待nginx深入知识后续更新。个人公众号:Java架构师联盟,每日更新技术文章
