建立高并发模型需要考虑的点
1、能不能通过增加机群(应用机群,服务机群)的方式去解决?好比一台机器能抗200qps, 然后你就40000qps的业务,那你最少需要200台机器,如果考虑到有机器down掉的情况,还要加备用服务器,这个具体加多少台就得去评估了。 防止出现有机器down掉,还得在每台机器上更新列表的情况,我们最好访问服务名(类似于域名),这样的话的好处就是,如果出现有机器down掉的情况,我只需要更新服务名和机器列表的关系表就可以了。
2、能不能把CDN或者NDN用到我们的系统?假设能用,如何把静态的图片、JS文件、HTML文件放在用户最近的一个节点?
3、用户大规模连接请求上来的时候,我们如何去均衡用户的请求(如何把这些请求放到后台的应用机群里面均衡的做处理)?Nginx负载均衡 + 自己设计的负载均衡策略(比如说把IP转换成整数后,mod取模、hash等)
4、那么在应用机群内部,应用机群和服务机群之间,如何均衡的处理它的访问请求?Nginx负载均衡 + 自己设计的负载均衡策略(比如说mod取模、hash等)
5、何时应该用LAMP(Linux+Apache+Mysql+PHP)架构,盗图一张
6、这里还有一个比较关键的问题,用户的登录状态你怎么去记录?用户的每一次请求,分配处理请求的服务器可能是不一样的,它不可能记录每个人的状态,那么这个状态如何同步?数据库集群Oracle/mysql+非关系型数据库Redis/Memcache,
拿mysql和redis来举例子,
mysql 是关系型数据库,并发量上限默认是100,想要调整并发效果1)自个可以修改my.ini中的max_connections,但是最大也就能设到 1000 2)用mysql调用数据库时,每次执行语句时,会做一个临时变量用来打开数据库,所以在用完数据库后及时关闭mysql临时变量 3)如果还是解决不了,表被锁死的现象很严重,就需要增加数据库机群或者用其它并发连接数上限较高的数据库,比如关系型oracle(贵,公司会不会用不 一定)和非关系型redis和memcache等;
redis 是非关系型数据库,并发量上限默认是1-2w左右,如果并发量特别大可以考虑用redis来做缓存。比如说用户请求访问量比较高的新闻网内容或者博客,可 以用redis来做缓存,有用户请求,就直接给他,如果博主对博客本身的内容做了更新,更新redis和mysql即可。 但是redis这种非关系型数据库,虽然并发量比较高,但是缺点也很明显:1)比较废内存 2)不能像mysql等关系型数据库那样能够处理事务、回滚等 3)没有1NF,2NF,3NF这种类似的类型,只有key-value,无法处理交易记录等这种类型的操作。
7、服务器,就是你的核心服务和数据库之间,如何去交互?如何平均的分摊压力?数据库集群Oracle/mysql+非关系型数据库Redis/Memcache
8、防火墙的规则是不是需要调整?高并发访问来的时候,可以适当的调整防火墙的规则,防止由于防火墙的故障造成网络拥塞。等高峰期过后,再把防火墙规则调回来。
9、每一层只做一件事,不容易出错。借鉴网络分层的思想,拿服务器来说,有专门的应用服务器,有专门的服务服务器,有专门的数据库服务器等等。在这些服务器上,可以部署Docker这种类似的虚拟机,每个虚拟机监听一个端口,只做一件事,不容易出错,还能减少成本。
10、可靠的软件开发:
1)网页代码大小, 所有静态页面、动态查询页面的代码要尽可能短,图片尽可能少,以减少对带宽的需求。尽量页面大小控制在5K之内。
2)网页压缩传输, 采用网页压缩存储,可以大大减少网页传输数据量的大小,仅为原数据量的1/3。不仅可以减少对网站带宽的占用,而且因为传输网页时间短,可大大减少负载均衡、防火墙的并发连接数和负载。缺点:应用服务器的CPU负载增加。
3)网页编程安全, 因为并发量大的时候,防火墙会关闭部分网络攻击检测功能,所以在网页编程时做一些必要的防攻击检测:
a)防止SQL注入式攻击: 对查询的SQL字符串进行合法性检验,防止被SQL注入攻击后真个数据库被下载。
b)防止人工F5刷新式攻击:在主页面、查询页面的客户端代码禁止F5按键,防止客户端恶意刷新。
c)防止人工频繁打开页面刷新式攻击:设置Cookie,判断客户端打开页面的时间间隔,低于2秒的认为是人工频繁打开页面刷新式攻击。程序控制暂停数秒后,客户端才能跳到查询首页。
d)防止程序自动刷新式攻击:检测HTTP_REFERER变量,减少程序自动刷新式攻击的可能性。
e)隐藏查询代码页面的地址:设置Web服务器,隐藏查询代码页面的地址,可有效防止各类程序自动刷新式攻击。
f)图片验证码:采用图片验证码,可有效防止程序自动刷新等方式的攻击,将图片分散于各查询服务器,避免在高并发连接数的环境中称为瓶颈。
4)后端采用“epoll+线程池”或者“boost+线程池”来提高并发处理能力。注:业务放在线程池内。