手把手教你打造千万并发级别的核算检测系统
近几年,某个地区一旦出现疫情导致全民核酸,对于核酸检测系统及健康码是一个很大的挑战,由于核酸检测系统和健康码系统上线时未经过高并发压力测试,导致实际遇到全民核酸检测的时候系统崩溃,这对排队做核酸的广大市民造成巨大的影响,那么有没有办法打造一个高并发千万级别的核算检测系统呢,答案是肯定的,12306这么高并发的系统都解决了高并发问题,那么核算检测系统怎么可能解决不了,今天我们就以1000万的高并发核算系统为目标讲讲如何搭建高并发的系统架构。
千万高并发写
首先我们结合实际的场景来说,当我们进行核算检测的时候,需要搜集用户的身份证系统及所在小区、核算检测试管编号等信息,如果1000万人同时做核酸,那么并发写入数据库的量就很大,假设核酸检测每10秒钟一个人,同时有1000个检测点进行检测,那么每秒最大写入并发为1000次,这个对于普通的数据库好像也没什么压力,对于nginx也没有压力,那么我们以极端情况下1000万人同时核酸为例(假设),那么秒产生1万的并发写情况,这个写请求第一时间会连接服务器。所以要确保服务器的带宽能够容纳这1000万的并发请求数据量,其次单台nginx优化后的最大连接数大概为2万,那么就需要500台服务器,连接后接受数据存入数据库,那么数据库的io也是有瓶颈的,假设mysql服务器的并发请求为4000,每秒处理的sql为1万条,那么也不够啊,这个时候我们可以通过两种方案,一种是kafka消息队列,把数据先存入消息队列。kafka的io吞吐量很大,一般在8万左右,然后异步处理消息插入到数据库中,第二种办法就是多个mysql节点,一个mysql不够,我们就弄mysql集群,分库分表技术。千万高并发读
高并发读的问题主要用到缓存技术,1千万的同时发起请求,那么可以将查询缓存,有缓存就直接返回,没有缓存就异步请求数据库,这里面要用到多级缓存,一千万的请求到达后端后还要鉴权,鉴权可以采用token客户端存储技术,查询健康码主键一般是身份证号码,可以在redis中根据主键身份证查询健康码缓存,没有健康码就异步发送请求健康码的消息队列,消息队列另一端会异步执行查询操作,并将结果存入redis缓存和客户端。具体优化办法(java为例)
1、nginx部署负载均衡这里我们给nginx部署在一台单独web服务器上,然后通过nginx分发至n台web应用上。
upstream www_balance{ server 192.168.0.101:8080 weight=5; #tomcat1的端口和权重 server 192.168.0.102:8088 weight=5; #tomcat2的端口和权重 }
上面配置了两台服务器及tomcat,这个根据你的服务器配置,像我们4核16g内存的服务器,我们一般部署4个tomcat,也就是说假如你有两台应用服务器,可以部署8个tomcat。在站点的配置上定义proxy_pass http://www_balance;2、tomcat的优化
tomcat的默认参数一定要优化!直接copy下面的参数即可
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" maxThreads="1000" minSpareThreads="100" maxSpareThreads="300" acceptCount="1000" redirectPort="8443" disableUploadTimeout="true" enableLookups="false" />3、mysql优化
将以下脚本存为nolimi.sh,然后执行即可,主要是调整操作系统单个进程打开文件fd的最大数量
#!/bin/sh if cat /etc/security/limits.conf | grep "* soft nofile 65535" > /dev/null;then echo "" else echo "* soft nofile 65535" >> /etc/security/limits.conf fi if cat /etc/security/limits.conf | grep "* hard nofile 65535" > /dev/null ;then echo "" else echo "*...
点击查看剩余70%
网友评论0