所谓高并发,就是同一时间有很多流量(通常指用户)访问程序的接口、页面及其他资源,解决高并发就是当流量峰值到来时保证程序的稳定性。
我们一般用QPS(每秒查询数,又叫每秒请求数)来衡量程序的综合性能,数值越高越好,一般需要压测(ab工具)得到数据。
假设我们的一个进程(也可以是线程或者协程)处理一次请求花费了50毫秒(业内达标范围一般是20毫秒至60毫秒),那么1秒钟就可以处理20个请求,一台服务器是可以开很多这样的进程并行去处理请求的,比如开了128个,那么这台机器理论上的QPS=2560。
千万不要小瞧这个数字,当你的QPS真有这么高的时候意味着你的DAU(用户日活)有2560*200=51.2万,业内一般是放大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语言性能,当语言短期不会替换时,可以通过堆机器解决高并发问题。
使用性能高的函数,在满足业务的条件下尽量简化业务代码逻辑,避免循环中操作SQL,巧妙使用redis的各种类型。

8.数据库性能

一台服务器上部署的数据库总是有一个瓶颈的,比如每秒查询数、每秒写入数。
我们可以通过增加很多从库解决查询(select语句)的瓶颈,称之为多从库模型,需要注意的是主从同步数据可能有延迟,当修改数据后马上需要查询时需要设置强制从主库读取。
我们可以将业务拆分,让某些表存储在一个数据库实例上,另一些表存储在其他数据库实例上,虽然一个数据库实例有自己的瓶颈,但是很多的数据库实例堆积起来性能就会大大改善,多个数据库实例的方案称之为多主库模型,主要是为了解决写入瓶颈(insert语句、update语句、delete语句)。
如果你有多个主库又有多个从库,你就实现了多主多从模型。
如果一个表存储的数据量很大,这个时候就要考虑分表了(一般用中间件实现),比如按时间分表或者按用户分表,当把一个表的所有分表都放在一个数据库实例上都满足不了要求的时候,你应该把某些分表存储在新的数据库实例上,这个时候一个表的数据分布到了不同的数据库实例上,这就是所谓的分布式数据库方案了,你需要处理的事情就很复杂了,比如处理分布式事务。
数据库的并发连接数也是有限制的,我们可以用连接池技术来应对,就是保持一定数量的和数据库的连接不断开的长连接,需要连接数据库的时候就从池子里选择一个连接,用完放回去就好了,这个一般也是用中间件来实现。
好的索引也能提高数据库的性能,有时候比堆多个从库的方案还要好。
如果能够减少数据库的读写,也算间接提高了数据库的性能,比如我们用redis来做缓存,用消息队列异步落库等。
有时候某些数据用数据库来计算需要很长时间,可以取到元数据(最小粒度的数据)用程序来计算,这称之为用内存换时间。

总结

一般大型项目基本是前后端分离的,从性能方面说就是为了将页面渲染的处理在客户端运行,降低服务器的压力。
从带宽层面考虑,css、图片、视频、JavaScript等文件资源能用CDN的就用CDN,能压缩的就尽量压缩,接口能减小返回数据的大小就尽量减小。
为了解决编程语言的不足或者单台服务器的瓶颈,可以先堆机器应对。
索引、多主多从、分布式数据库、缓存、连接池、消息队列等是从数据库方便考虑如何优化性能。
有时候程序的低耦合性比程序的高性能更重要,不要一味地追求高性能。
 

如何设计高并发web应用的更多相关文章

  1. PHP-学习大规模高并发Web系统架构及开发推荐书籍

    以下书籍内容涵盖大型网站开发中几个关键点:高可用.高性能.分布式.易扩展.如果想对大规模高并发Web系统架构及开发有很系统的学习,可以阅读以下书籍,欢迎补充! 一.<Linux企业集群—用商用硬 ...

  2. 转---高并发Web服务的演变——节约系统内存和CPU

    [问底]徐汉彬:高并发Web服务的演变——节约系统内存和CPU 发表于22小时前| 4223次阅读| 来源CSDN| 22 条评论| 作者徐汉彬 问底Web服务内存CPU并发徐汉彬 摘要:现在的Web ...

  3. 高并发web系统设计

    转载自:http://blog.csdn.net/qq_26562641/article/details/53170913 一.一般高并发web系统这里的一般指的是秒杀之类的电子商务系统,比如说小米抢 ...

  4. nginx简介(轻量级开源高并发web服务器:大陆使用者百度、京东、新浪、网易、腾讯、淘宝等)(并发量5w)(一般网站apache够用了,而且稳定)

    nginx简介(轻量级开源高并发web服务器:大陆使用者百度.京东.新浪.网易.腾讯.淘宝等)(并发量5w)(一般网站apache够用了,而且稳定) 一.总结 1.在连接高并发的情况下,Nginx是A ...

  5. 高并发Web服务的演变:节约系统内存和CPU

    一.越来越多的并发连接数 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.以最简单粗暴的方式解决,就是增加Web系统的机器和升级硬件配置.虽然现 ...

  6. 高并发WEB网站优化方案

    一.什么是高并发在互联网时代,所讲的并发.高并发,通常是指并发访问,也就是在某个时间点,有多少个访问同时到来.比如,百度首页同时有1000个人访问,那么也就是并发为1000.通常一个系统的日PV在千万 ...

  7. 高并发 Web 服务的演变:节约系统内存和 CPU

    本文内容 越来越多的并发连接数 Web 前端优化,降低服务端压力 节约 Web 服务端的内存 节约 Web 服务器的 CPU 小结 一,越来越多的并发连接数 现在,Web 系统面对的并发连接数呈现指数 ...

  8. (转)高并发Web服务的演变——节约系统内存和CPU

    一.越来越多的并发连接数 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.以最简单粗暴的方式解决,就是增加Web系统的机器和升级硬件配置.虽然现 ...

  9. 【WEB】高并发Web服务的演变-节约系统内存和CPU

    目前主流浏览器通常可以存在2-6个并发. 连接和请求,占据了服务器的大量CPU和内存等资源.在资源数目超过100+的网站页面中,使用更多的下载连接,非常有必要. 缓解“高并发”的压力的手段. 一. W ...

随机推荐

  1. 手把手教你分析Mysql死锁问题

    前言 前几天跟一位朋友分析了一个死锁问题,所以有了这篇图文详细的博文,哈哈~ 发生死锁了,如何排查和解决呢?本文将跟你一起探讨这个问题 准备好数据环境 模拟死锁案发 分析死锁日志 分析死锁结果 环境准 ...

  2. qW3xT.2,解决挖矿病毒

    在阿里云使用redis,开启了6379端口,但是当时并没有对redis的密码进行设置. 在晚上一点左右.阿里云给我发短信,告诉我服务器出现紧急安全事件.建议登录云盾-态势感知控制台查看详情和处理. 于 ...

  3. DALI开关

    DALI开关简介 一:符合协议IEC 62386 二:DALI总线取电,低压操作,安全可靠 三:可以开,关,调光,调色温 四:DALI总线取电,低压操作,安全可靠 五:可按压开,关,旋转调光,调光器耐 ...

  4. Disruptor 基础篇

    Disruptor 基本概念 RingBuffer结构 Sequencer (生产.消费协调者) EventFactory & EventTranslator SequenceBarrier ...

  5. Linux服务器架设篇,DNS服务器(三),正反解区域的配置

    一.大体架构 DNS服务器其实只有一个"真正"的配置文件,即 /etc/named.conf .其他的配置文件都是依据此配置展开的.每个域都需要两个配置文件,即正解文件和反解文件. ...

  6. boost multi_index简单了解

    #include <string> #include <iostream> #include <boost/multi_index_container.hpp> # ...

  7. C语言实现链式队列

    链式队列,简称"链队列",即使用链表实现的队列存储结构. 链式队列的实现思想同顺序队列类似,只需创建两个指针(命名为 top 和 rear)分别指向链表中队列的队头元素和队尾元素, ...

  8. 返回指定字符串位置的函数FIELD(S,S1,S2,...) 与 FIND_IN_SET(S1,S2) 函数

    FIELD(S,S1,S2,...)  与 FIND_IN_SET(S,S1) 函数  ------> 这2个函数都是返回指定字符串在源串中的出现的位置(皆是第一次出现的位置),但2个函数的参数 ...

  9. Codeup 25594 Problem H 例题5-8 Fibonacci数列

    题目描述 输入一个正整数n,求Fibonacci数列的第n个数.Fibonacci数列的特点:第1,2个数为1,1.从第3个数开始,概述是前面两个数之和.即: 1,1,2,3,5,8,13,21 - ...

  10. 官方解读:Salesforce线上考试新政与福利

    随着疫情在世界范围内的迅速蔓延,Salesforce推出了一系列的线上认证考试改进方案,方便Salesforce从业者在疫情阶段也能够安全.便利地参与考试,今天让我们一起来捋一捋那些,和我们密切相关的 ...