大家好,我是轩辕。昨晚,成都因为疫情再次登上热搜,而这一次,上热搜的词条是一家软件公司的名字。事情的起因是这样的:从9月1日起,成都市政府宣布对全员进行为期四天的核酸检测。昨天下午,我们小区物业通知,预计在14:00-17:00之间进行检测,并告诉我们会通知我们去楼检测。结果直到晚上才收到通知。我很忙,没有注意其他任何事情。结果上网查了一下,发现成都核酸系统崩溃的各种笑话满天飞。是的,成都核酸检测系统又崩溃了!吃苦耐劳的大白只好用这种古老的方法寻找“信号”。因为这个系统出了问题,核酸检测工作非常缓慢,大量市民排队等候。平时半小时就能搞定,昨晚却排了几个小时的队。到晚上23:30,物业只会直接通知一部分人,其他人可以洗漱睡觉。好家伙,不知道有多少人白排了几个小时。为什么这个好的系统崩溃了?有网友挖出一条中标公告,称这套系统背后的服务器是浪潮的服务器:超过1000万个项目,这是结果?但随后,似乎是浪潮的人出来回复:他们说的很清楚,上面的中标只是基础运维,这个软件系统的设计是别人做的。然后有人开始喷健康码,喷鹅厂。但实际上,倒塌的不是健康码,而是大白使用的核酸采集录入系统,这是两个独立的系统。然后就有人爆出这个软件是东软出的。于是一时间,大家的怒火都转向了东软,很快东软的词条就被送上了微博热搜榜第一的位置。对于倒塌的原因,朋友圈和微信群里也流传着各种说法,一时之间真假难辨。有人说这个系统背后用的MySQL用的是超宽大表;有人说MySQL单表容量太大,导致性能下降;也有人说是负载均衡不够好,无法支持高并发。总结一下,基本上有两个原因:1、数据库的问题。数据量大后,查询和检索效率低下。成都人口超过2000万。核酸每天执行一次,即单日新增2000万条记录。这几天一直在做,数据量很快上亿。如果后端使用MySQL,则不会分表。那真是令人窒息。2.高并发的问题,同时有大量请求,服务器无法处理。一般情况下,使用nginx负载均衡,单机可以达到上万并发。但是成都2000万+的人口,全盘做核酸,几万个并发肯定是不够的。如果这个系统背后真的有一个nginx+mysql(不考虑表),那么昨晚发生的事情也就不足为奇了。好吧,吃瓜归吃瓜,我们还是需要一些干货的,作为程序员,要学会在吃瓜中成长。在这篇关于高并发之路的文章中,我们先来回答一个问题:如何做高并发?让我们从头开始。1、单机时代初期,用户量很小,一天有几百上千个请求,一台服务器完全够用。我们使用Java、Python、PHP或者其他后端语言开发一个Web后端服务,然后使用一个MySQL来存储业务数据。他们携手合作,运行在同一台服务器上,对外提供服务。2.应用和数据库慢慢分离,用户量开始增加。一台服务器有点多,把他们拆分成两台服务器,一台专门跑Web服务,一台专门跑数据库,这样就可以独享服务器上的CPU和内存资源,不存在需要互相抢劫。3、缓存系统后来用户量进一步增加,每次查数据库都要花一点时间。引入缓存系统可以有效缩短服务的响应时间。4、软件负载均衡用户数还在增加,某web服务的吞吐量开始达到上限,系统开始卡顿。这时候可以复制多个web服务,然后用一个nginx做负载均衡,把请求分发到所有的web服务器上,提高并发量。5、数据读写分离随着系统的运行和用户的增长,数据量增加,数据库的瓶颈开始出现,读写明显变慢。这时可以增加一个新的数据库服务器,将读写分离,两者同步数据,提高数据库服务的整体I/O性能。6、数据库分库分表系统的数据越来越多。即使读写分离,一张表的记录也越来越多,从几百万到几千万,甚至过亿。将它们全部塞进同一张表中,检索和查询将耗费时间和精力。分库分表,拆分数据,提高数据查询效率。7、经过硬件负载均衡后,业务发展的很好,用户量激增,让强大的Nginx都应付不过来了。一个不够就再加几个,然后引入硬件负载均衡服务器,比如F5,将网络流量分配到不同的Nginx服务器上,再次提升性能。8.DNS负载均衡后,用户数还在增加,F5等强大的硬件负载均衡服务器无法处理这么高的并发。老办法,一个不够,再做几个。这一次,我们在域名解析上下功夫。不同地域的用户访问同一个域名时,会解析到不同的IP地址,从而进一步分流流量。以上就是从最简单的单机到复杂集群的高并发演进路径。高并发是个大话题,涵盖的远不止上面这些。除了这些,编程语言中的消息队列、数据库选择、CDN、协程等技术都可以帮助提高并发性。回到这次的崩溃,本以为经过一夜的折腾,今天应该会好一些,结果下午一开始,又??继续不好:在我写这篇文章的时候,问题公司已经发布了说明:网络:你的意思是怪我?
