所谓高并发就是有大量的流量(通常指用户)同时访问程序的界面、页面等资源。解决高并发的办法就是在流量高峰到来的时候保证程序的稳定性。我们一般用QPS(queriespersecond,也称为requestspersecond)来衡量程序的整体性能。值越高越好。一般需要压测(ab工具)获取数据。假设我们的一个进程(也可以是线程或者协程)处理一个请求需要50毫秒(行业标准范围一般是20毫秒到60毫秒),那么1秒可以处理20个请求,一个服务器可以如果开启很多这样的进程并行处理请求,比如开启128个,那么本机的理论QPS就是2560,不要小看这个数字。当你的QPS真的那么高的时候,说明你的DAU(DailyActiveUser)有2560*200=512000。业界一般都是放大200倍来计算。拥有这样的每日活跃用户帐户表明您做得很好。向上。服务器能达到的最大QPS受很多因素的影响,比如机器参数配置、机房地理位置、CPU性能、内存大小、磁盘性能、带宽大小、编程语言、数据库性能、程序架构等。我们将一一阐述。.1、机器参数配置通俗易懂。比如服务器最多可以开128个进程,但是你设置最多100个进程,属于服务器调优。2、机房的地理位置如果你是海外用户,应该选择国外服务器机房,否则应该选择国内服务器机房,因为机房离用户越近,时间损失越低在传输中。3、CPU性能CPU性能越好,处理速度越快,核心越多,可以并行开启的进程就越多。4、内存大小内存越大,程序可以将更多的数据直接放到内存中,从内存中读取数据比从磁盘中读取数据要快得多。5、磁盘性能不用说,一般固态硬盘的性能要比机械硬盘好很多。性能越好,读写数据的速度越快。6.带宽服务器的带宽一般是指输出带宽,单位是Mb/S。比如带宽是8Mb/S,就是1MB/S。如果提供文件下载服务,服务器带宽可能会被一个用户的下载行为耗尽。一般将图片、视频、css文件、JavaScript脚本等资源放在第三方CDN上,按流量计费,不占用服务器带宽。如果用户规模不大,基本上一台服务器就够了。这时候一般都是按照固定的带宽大小来计费的。如果用户规模非常大,基本上会通过一个负载均衡器来分流,也就是将流量按照一定的规则分配到不同的服务器上,负载均衡器一般会按流量计费。如果一个请求返回的平均数据大小为50KB,要达到1000QPS的指标,需要的峰值带宽=1000*50*8/1024=390.625Mb/S。在设计接口时,我们应该尽量减少返回数据的大小。例如,user_id可以简化为uid。压缩图片、视频、css等文件的目的是为了减小数据的大小。7.编程语言编译型语言的性能普遍优于解释型语言。比如go语言的性能就优于php语言。在语言短期内不会被替代的情况下,高并发问题可以通过堆叠机器来解决。8.数据库性能部署在服务器上的数据库总是存在瓶颈,比如每秒的查询数和每秒的写入数。我们可以通过增加大量的从库来解决查询(select语句)的瓶颈,这就是所谓的多从库模型。需要注意的是,主从同步数据可能存在延迟。当修改数据后需要立即查询时,需要设置从主库强制读取。我们可以对业务进行拆分,让一些表存储在一个数据库实例上,另一些表存储在其他数据库实例上。虽然一个数据库实例有自己的瓶颈,但是很多数据库实例堆积起来性能会有很大的提升。多数据库实例的方案称为多主数据库模型,主要解决写入瓶颈(插入语句、更新语句、删除语句)。如果你有多主多从,你就实现了多主多从模型。如果一张表存储的数据量很大,这时候就需要考虑分表(一般用中间件实现),比如按时间分表或者按用户分表。当一个表的所有子表都放在一个数据库实例不能满足要求的时候,就应该在新的数据库实例上存储一些子表。这时候一个表的数据分布到不同的数据库实例中。这就是所谓的分布式数据库解决方案。你需要处理的事情非常复杂,比如处理分布式事务。数据库的并发连接数也有限制。我们可以使用连接池技术来处理,就是和数据库保持一定数量的长连接。当您需要连接到数据库时,从连接池中选择一个连接。回去就好了,这个一般都是用中间件来实现的。一个好的索引还可以提高数据库的性能,有时甚至比堆叠多个从库的方案还要好。如果能减少数据库的读写,也算是间接提高了数据库的性能。比如我们用redis做缓存,用消息队列做异步存储。有时候用数据库计算一些数据需要很长时间,可以拿到元数据(最小粒度的数据)用程序计算,这叫做内存交换时间。9.程序架构比如实现同样的功能,初级程序员写的程序需要循环100次,而高级程序员写的程序只需要循环10次,效果肯定是不一样的。综上所述,一般大型项目基本上都是前后端分离的。从性能上来说,就是将页面渲染过程运行在客户端,减轻服务端的压力。从带宽的角度来说,如果css、图片、视频、JavaScript等文件资源可以使用CDN,就使用CDN。如果可以压缩,尽量压缩。如果接口可以减小返回数据的大小,尽量减小。为了解决编程语言不足或者单台服务器的瓶颈,可以先把机器堆起来。索引、多主多从、分布式数据库、缓存、连接池、消息队列等,都是从数据库的便利性出发,如何优化性能。有时候程序的低耦合比程序的高性能更重要,所以不要盲目追求高性能。TODO持续更新
