高并发网站的演变和优化

news/2024/5/9 22:03:14/文章来源:https://blog.csdn.net/qq_35356840/article/details/107017628

一,什么是高并发
高并发是互联网分布式系统架构设计中必须考虑的因素之一,通常指:通过设计保证能够同时并行处理很多请求。
高并发指标:
响应时间:系统对请求做出响应时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统响应时间。
吞吐量:单位时间内处理的请求数量。
每秒查询量QPS:每秒响应请求数。在互联网这个指标和吞吐量区分的没有这么明显。
并发用户数:同时承载正常使用系统功能的用户数量。例如一个即时通讯系统,同时在线量一定程度代表系统并发用户数。

二,创业初期系统
假如我们现在有一家创业公司,注册用户10万,每天有10%的用户访问系统也就是1万的活跃用户。按照二八原则,每天高峰用户会达到80%,也就是8000人。假如每个人活跃4小时,每个人提交20次表单,也就是说有16万次提交在4小时内,平均每秒10次。
按照互联网通常配置应用服务4核8G,数据库服务16核32G。
比如每次请求对数据库3次请求,也就是说每秒30次。
按照这台数据库配置,支撑是绝对没有问题的。

三,集群部署
在CEO带领下公司得到了高速发展,注册用户达到了500万。此时日活用户50万,高峰时对系统每秒请求是500次。然后对数据库请求1500次,这个时候会怎样?
按照上面业务系统配置,如果业务逻辑比较重,比较消耗CPU,此时的机器CPU可能负载过高。
然后数据库层面,以上述配置,对于1500次每秒请求,基本还是可以接受。
所以此时需要做的一件事情,就是把系统集群化部署。
在前面挂一个负载均衡层,把请求均匀的打到系统层面,比如再加一台应用服务器,这样每台应用服务器请求只有250/s。

img

四,数据库分库分表+读写分离
此时用户注册达到1000万,日活跃用户100万。对系统每秒请求1000次,系统层面可以继续通过集群化方式来扩容,通过负责均衡层把请求均匀分布。
此时对于数据库层面请求3000/s。
通常来说,对于普通的16核32G机器配置,一般的线上经验是:不要让其每秒请求支撑超过2000,一般控制在2000左右。
所以需要对数据库进行分库分表+读写分离。每个主库至少挂一个从库。
假如读写并发3000/s,这其中1000写,2000读。
这样分库后主库写500/s,从库读1000/s。

img

五,数据库进一步拆分
公司业务迅速发展,注册用户达到了2000万!每天活跃用户200万!每天表单新增数据50万条!高峰请求量达到了1万!
同时公司带来了两轮融资,估值达到了几亿美金!一只朝气蓬勃的幼年独角兽诞生的节奏。
经过一段时间的运行现在表中数据已经到了两三千万条数据,勉强还能支撑。
但是,眼看数据库访问性能越来越差,单表数据量越来越大!
然后高峰请求现在是1万,系统可以部署20台机器,平均每台支撑500请求,还能抗的住,没啥大问题。
但数据库层面呢?
首先我们考虑一个问题,如何是数据库支撑每秒上万并发请求?
上面我们说了,单台数据库每秒请求不要超过2000,所以我们可以部署5台机器,
比如订单表,我们拆分到5个库中,db_order_01,db_order_02,db_order_03,db_order_04,db_order_05。
这样每天50万条数据,均分到每个库中10万条。如图

img

但上述数据库架构还有一个问题,那就是单表数据量还是很大,如果订单一年有一亿条,每个表就有2000万,这也是太大了。
比如可以把订单表拆分为1000张表,这样1亿数据量分散到每个表中数据只有10万条,然后这1000张表分散到这5台数据库里。
写入数据库时候,需要路由两次,对订单Id进行hash后取模获取数据库地址,然后再根据表数据量取模,路由到那张表上。
这样1亿数据量每张表一年才10万条,10年才百万级数据量。
当然这5台数据库需要配置从库,毕竟在2000请求中,按照二八原则,有400写,1600读。这样主库的请求只有400/s,从库1600/s。

img

具体的分库分表落地的时候,需要借助数据库中间件来实现分库分表和读写分离,大家可以自己参考 sharding-jdbc 或者 mycat 的官网即可,里面的文档都有详细的使用描述。

六,缓存集群引入
业务不断发展,每秒1万访问已不在是高峰,系统需要支撑每秒几万的访问。但是不能仅仅考虑数据库层面的分库分表了,大家要知道“数据库其实本身不是用来承载高并发请求的”。
这个时候我们要结合业务,一般的业务都是写少读多,80%-90%访问的是热数据。这样我们可以把热数据放在缓存中。
另外缓存单机承载的并发量都在每秒几万,甚至每秒数十万,对高并发的承载能力比数据库系统要高出一到两个数量级。

img

七,引入消息中间件集群
其实在高并发下,有一些请求是允许异步执行等待几十秒,甚至几分钟后落库。
此时完全可以引入消息中间件,然后基于MQ做一个削峰填谷。比如就以平稳的100/s的速度消费出来然后落入数据库中即可,此时就会大幅度降低数据库的写入压力。
消息中间件系统本身也是为高并发而生,所以通常单机都是支撑几万甚至十万级的并发请求的。

img

八,总结

1,整个架构:可采用分布式架构,利用微服务架构拆分服务部署在不同的服务节点,避免单节点宕机引起的服务不可用!

2,负载均衡:使用nginx等对访问量过大的服务采用负载均衡,实现服务集群,提高服务的最大并发数,防止压力过大导致单个服务的崩溃!

3,数据库:采用主从复制,读写分离,甚至是分库分表,表数据根据查询方式的不同采用不同的索引比如b tree,hash,关键字段加索引,sql避免复合函数,避免组合排序等,避免使用非索引字段作为条件分组,排序等!减少交互次数,一定不要用select *!

4,加缓存:使用诸如memcache,redis,ehcache等缓存数据库定义表,结果表等等,数据库的中间数据放缓存,避免多次访问修改表数据!登录信息session等放缓存实现共享!诸如商品分类,省市区,年龄分类等不常改变的数据,放缓存,不要放数据库!同时要避免缓存雪崩和穿透等问题的出现导致缓存崩溃!

5,使用消息中间件:对服务之间的数据传输,使用诸如rabbit mq,kafka等等分布式消息队列异步传输,防止同步传输数据的阻塞和数据丢失!

6,多线程:现在的服务器都是多核心处理模式,如果代码采用单线程,同步方式处理,极大的浪费了CPU使用效率和执行时间

7,CDN加速:如果访问量实在过大,可根据请求来源采用CDN分流技术,避免大流量完成系统崩溃!

8,避免低效代码:不要频繁创建对象,引用,少用同步锁,不要创建大量线程,不要多层for循环!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_846575.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iis网站报错:您试图从目录中执行CGI、ISAPI 或其他可执行程序,但该目录不允许执行程序...

本人使用WIN2003 INTERNET信息服务(IIS)管理器建立一个网站虚拟目录,结果浏览网页时出现错误,错误提示信息大体如此: 该页无法显示 您试图从目录中执行 CGI、ISAPI 或其他可执行程序,但该目录不允许执行程…

值得收藏!最佳26个国外 CSS 酷站推荐网站

这个列表收集的最佳26个国外 CSS 酷站推荐网站对于网页设计师和 Web 开发人员都非常有用。设计师可以从下面列出的这些网站获取优秀的设计理念和流行的设计趋势,获取大量的创作灵感,进而设计出更有创意的作品。如果你有收藏这个列表中遗漏的网站&#xf…

网站统计中的数据收集原理及实现(转)

本文转自codinglabs,原文地址:http://www.codinglabs.org/html/how-web-analytics-data-collection-system-work.html 网站数据统计分析工具是网站站长和运营人员经常使用的一种工具,比较常用的有谷歌分析、百度统计和腾讯分析等等。所有这些…

数据获取网站分享

内容来自悟空智能科技公众号,侵权删。 1公开的数据库 - 国家数据 - http://data.stats.gov.cn/index.htm 数据来源于中国国家统计局,包含了我国经济民生等多个方面的数据,并且在月度、季度、年度都有覆盖&#xff0…

浅谈前端中的onmouseover 事件

修改别人的模板遇到一个问题,分类图的切换默认是五个,我想增加四个,一直没有增加成功。它使用的onmouseover 事件。 去查了一下: 定义和用法 onmouseover 事件会在鼠标指针移动到指定的对象上时发生。 语法 οnmοuseοver"…

Docker系列器十:docker-compose和网站的负载均衡

Docker应用中,为了达到高可用,可以做很多的web服务,保持服务的稳定性,在web的出口处是haproxy等负载应用。 命令: 在和yml文件的同文件下,执行任何的docker-pose的命令,否则是提示找不到文件的…

大型网站系统架构的演化

http://www.cnblogs.com/leefreeman/p/3993449.html 前言 一个成熟的大型网站(如淘宝、京东等)的系统架构并不是开始设计就具备完整的高性能、高可用、安全等特性,它总是随着用户量的增加,业务功能的扩展逐渐演变完善的&#xff0…

软件体系结构---优酷网站架构分析

1.web环境下架构特性 可扩展、可靠、简单核心、模块化 2.优酷网站分析 1)前端框架 模块分离、前端可扩展、分层UI分离 2)存储结构 在体系结构上,优酷网采用分布式的结构,服务器和存储设备分布在全国各地,用户就近访问,…

大型网站架构系列:分布式消息队列(一)

以下是消息队列以下的大纲,本文主要介绍消息队列概述,消息队列应用场景和消息中间件示例(电商,日志系统)。本次分享大纲消息队列概述消息队列应用场景消息中间件示例JMS消息服务(见第二篇:大型网…

JS基础17-网站效果

一、鼠标移入触发显示框和更改属性 要实现的效果 window.οnlοadfunction(){ //获取到div框里的li数组var oToplistdocument.getElementById(top-list);var oToplistlioToplist.getElementsByTagName(li);var oPulldocument.getElementById(pull-down);//鼠标移入时&#xff0…

Python_记一次网站数据定向爬取实现

记一次网站数据定向爬取实现 by:授客 QQ:1033553122 测试环境: Python版本:Python 3.4 Win7 请勿用于商业及非法用途,仅供学习研究用,否则后果自负 数据爬取场景 如下,打开网站查询页面,输入关…

大型网站架构演变和知识体系

之前也有一些介绍大型网站架构演变的文章,例如LiveJournal的、ebay的,都是非常值得参考的,不过感觉他们讲的更多的是每次演变的结果,而没有很详细的讲为什么需要做这样的演变,再加上近来感觉有不少同学都很难明白为什么…

v2013调试无法访问此网站 localhost 拒绝了我们的连接请求

问题描述: 别人给的服务器代码,在本地部署以后调试的,localhost:8080 可以访问,localhost:2524访问不了需要改什么配置吗 解决思路: 这种只能在服务器上访问,可能端口号2524…

如何优化您的网站以提高速度

大家好! 今天,我们有一个来宾帖子,介绍有关如何加快网站速度的一些提示! 他目前正在一家电子商务网站上工作,他的任务之一是使网站快速加载。 因此,请在下面阅读! 〜迈克 网站速度已成为诸如Go…

如何优化程序提高运行速度_如何优化您的网站以提高速度

如何优化程序提高运行速度大家好! 今天,我们有一个来宾帖子,介绍有关如何加快网站速度的一些提示! 他目前正在一家电子商务网站上工作,他的任务之一是使网站快速加载。 因此,喜欢在下面阅读! 〜…

网站托管平台_托管Kubernetes平台综述

网站托管平台在容器协调器的竞争中,Kubernetes不断前进。 但是,就像我在Docker主机上撰写我的文章时一样,人们经常被困在将基础架构投入生产的步骤上。 与我最初写这篇文章时不同,该行业取得了长足的发展,正如您将看到…

PHP的网站主要攻击方式有哪些?

1、命令注入(Command Injection) 2、eval注入(Eval Injection) 3、客户端脚本攻击(Script Insertion) 4、跨网站脚本攻击(Cross Site Scripting, XSS) 5、SQL注入攻击(SQL injection) 6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF) 7、Session 会话劫持(Session …

Xshell命令行学习,宝塔创建网站

参考链接 :https://blog.csdn.net/u014074697/article/details/86241642 宝塔创建面板-在安全组新添加一个端口 浏览器输入Bt-panel网址,登入用户名和密码即可进入

curl网站开发指南

整理curl命令: curl www.sina.com curl -o [文件名] www.sina.com curl -L www.sina.com curl -i www.sina.com curl -I www.sina.com curl -v www.sina.com curl --trace output.txt www.sina.com curl --trace-ascii output.txt www.sina.com php-curl这个库也不…

电商购物网站(登陆注册购物车详情页等)(仿jd)

电商购物网站(仿jd) 源码链接: https://gitee.com/ZRXXUAN/shopping https://github.com/ZRXXUAN/shopping 介绍 仿照jd写的电商购物网站 可以实现基本功能,登录、注册与数据库交互,购物车,详情页&…