针对千万级人口城市的核酸检测系统的设计分享

针对地市级千万级人口的核酸检测系统,相信绝大多数软件公司在高并发处理上还是少一些经验的,下面根据我们开发过的高并发项目上总结几点供大家参考:

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,然后执行即可

#!/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 "* hard nofile 65535" >> /etc/security/limits.conf

fi

修改mysql配置文件/etc/my.cnf,在[mysqld]标签里添加以下代码:max_connections=3600

以上是常规操作,没有太多要讲的,按上面的配置即可。下面说下核心的部分,业务系统设计:

4、数据库设计

这里比较重要!我们保存核酸检测的信息主要有:

姓名、身份证号、电话、区/县、乡镇、街道/村、小区、单元、房屋编号、核酸检测编码、核酸检测机构、核酸检测结果等。

针对上述字段信息,第一件事,我们要做分库!!记着能做分库的,不要做分表。为了将来灵活扩容,因为分表还是压力在一个库上,而一个库是不能随便拆分至不同服务器的。而分库,我们可根据访问量选择把多个数据库部署在一台服务器上,还是每个数据库各自占用一台服务器。

介于此,我们考虑有两种分库方案:

a、按出生日期年份分库,同一年出生的人的核酸信息记录在一个数据库上,我们粗略统计一下1000万人口的城市,按80岁年龄段,,平均一年一个库的话,这样一个数据库库记录在十几万左右。这个数据量完全够mysql快速响应的。如果觉得库太多,也可以分段,每10年分在一个库中也可以。

b、按行政区分,可以按街道或区、县来创建分库。道理同上。

另一个重要的事,以上数据库绝对不要加索引(本次的核酸检测码作主键),目的就是为了保证最快的写库操作,也就是为了确保现场核酸登记时,高并发下的快速响应,只有响应够快,nginx,tomcat理论上的配置并发数才会达到最高。这个不难理解,比如nginx有10000的并发,同一时刻来了10000人同时提交检测,nginx把请求交给各个tomcat,如果30秒内都没有响应完成,那么第一时刻来的请求到后面30s内再来的请求就只能排队等候了。

相应如果tomcat都能在1秒内处理完请求,那么随着请求的建立和释放动态的过程,一直会有空闲的连接数响应新的检测请求就可以了。因为现场场景中,医务人同每次扫码两个人间隔时间起码也得有2-3秒的间隔,关键点来了,我们java应用每一次响应的用时理论上只要小于现场医务人员两次扫码确认的时间即可达到良好的检测体验。大概情况 就是这样:

10000人并发提交-》nginx响应分发-》n个tomcat各自接收到大概100左右请求->花费1s时间处理完毕->nginx连接释放-》过1-2s(空闲10000连接)-》新到10000请求,以此类推....

有人讲,上面道理不假,如何保证1s处理完,这个不难,参考上面的数据库设计(分库)一定可以做到!(当然你的java 应用代码起码得说得过去)

最后有人说nginx10000并发数够用吗?这里nginx可是单点啊,本文讲的是1000万人口,并不是1000万并发,我们算一下1000万人口的城市,最多有1万个核酸检测点,假如最巧合的情况,这1万的检测点同时上报采样,那最极端的情况也就是10000个并发连接。所以nginx这个配置是足够使用了。那为啥有的系统配置了nginx20000的并发数,也不行呢?原因就在于应用层tomcat中的java应用响应太慢了,请求时间占用太久,把连接数都占用了。所以确保应用系统快速入库响应的能力是最根本的解决方法)。

还有人问,java中分库的代码,有参数吗?我们也有:),我们多年用自己开发的框架,一直做多库分库操作。

以下参考:

package totcms.db;

import java.util.Hashtable;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.sql.DataSource;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

/**

*

* @ totcms多库

*/

public class DBMap {

private static Hashtable ds = new Hashtable();

private static Log log = LogFactory.getLog(DBMap.class);

static {

String[] s={"mydb_bid","mydb_sale","mydb_buy"};//数据源

try {

Context initContext = new InitialContext();

Context envContext = (Context) initContext.lookup("java:/comp/env");

for(int i=0;i<s.length;i++){

ds.put(s[i],(DataSource) envContext.lookup(s[i]));

log.info("DBMap init datasource = " + s[i]);

}

} catch (javax.naming.NamingException e) {

e.printStackTrace();

}

}

public static DataSource getDs(String s){

DataSource d=(DataSource)ds.get(s);

if(d==null){

d=createS(s);

}

return d;

}

public static DataSource createS(String s){

DataSource d=null;

try {

Context initContext = new InitialContext();

Context envContext = (Context) initContext.lookup("java:/comp/env");

ds.remove(s);

d=(DataSource) envContext.lookup(s);

ds.put(s,d);

log.info("createS = " + s);

} catch (javax.naming.NamingException e) {

e.printStackTrace();

}

return d;

}

}

上面代码是数据源的管理

数据库的配置在xml文件中:

<?xml version="1.0" encoding="UTF-8"?>

<Context path="/" reloadable="true">

<Resources cachingAllowed="false"/>

<Resource auth="Container" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" logAbandoned="true" maxIdle="300" maxTotal="300" maxWaitMillis="-1" name="mydb_bid" password="_" removeAbandoned="true" removeAbandonedTimeout="100" type="javax.sql.DataSource" url="jdbc:sqlserver://192.168.0.101:1433;DatabaseName=aaa;characterEncoding=utf-8" username="aaa"/>

<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" logAbandoned="true" maxIdle="300" maxTotal="300" maxWaitMillis="-1" name="mydb_sale" password="" removeAbandoned="true" removeAbandonedTimeout="100" type="javax.sql.DataSource" url="jdbc:mysql://192.168.0.102/bbb?useUnicode=true&characterEncoding=UTF-8" username="root"/>

</Context>

细心可以看到,可以同时支持sqlserver,mysql,oracel等各种数据库。

最后还可能有人问到,上面的库没有做索引,那么检测结果的查询怎么办,这个涉及到另一个库设计:读写分离。上面的库主要解决写的问题,至于读,其实好办了,毕竟核酸检测结果的生成是检测机构操作,可以在检测机构更新检测结果的时候,把该条数据读取写到一个做了索引(按身份证号)的核酸结果数据库中供查询使用,这个数据库的设计 可以按月分库,按日分表设计)

最后上个构架图

检测上报

 

结果查询

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【资源说明】 基于 SpringBoot+Vue核酸检测登记查询系统源码+数据库sql+项目说明.zip 该项目是个人毕设项目源码,评审分达到95分,都经过严格调试,确保可以运行!放心下载使用。 该项目资源主要针对计算机、自动化等相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现类似其他功能。 核酸检测登记查询系统 natweb目录为前端项目 采用Vue+ElementUI+VantUI natserver目录为后端项目 采用SpringBoot+SpringSecurity+Mybatis+MySQL nat.sql 为数据库文件,nat_with_v2_system为兼容微信登录和非微信登陆的数据库 (admin默认密码为123456) (提醒:部署在服务器上时,请配置SSL证书,前端通过浏览器调用摄像头时必须为https协议) ## 项目配置 运行前请修改配置 前端配置路径 public/config.js 项目功能简介 ### 用户端 (路径:/#/user) 个人信息登记、个人信息二维码展示、检测结果查询 目前可以支持不使用微信平台来进行用户数据录入功能,添加了一套独立的用户登录功能(开关位于`UserLoginConfig.useWechet`),请使用nat.sql数据库文件来兼容独立用户登录功能和硬件节点信息功能 ### 采集端 (路径:/#/operator) 通过扫描试管条码和个人信息二维码进行信息录入 chrome 在47后调用navigator.mediaDevices.getUserMedia 仅能在在https和 loaclhost环境下才可以使用。本机调试的话**只有用户在浏览器端设置信任该域名才可以使用本地摄像头。** #### 设置方法 地址栏输入`chrome://flags/`, 搜索`unsafely` enabled 并填入要授信的域名。 ### 后台 (路径:/#/admin) 后台有两种角色可登录,超级管理员和采集单位账号 超级管理员可进行检测结果查询、人员信息查询、以及所有单位的试管管理、任务管理和采集人员管理 单位账号可进行本单位下的试管管理、任务管理和采集人员管理
核酸检测智能巡检系统设计需要考虑以下几个方面: 1. 系统架构设计系统应该具备分布式架构,包括前端数据采集、中间层数据处理、后端数据存储等模块,以保证系统的高效性和可扩展性。 2. 数据采集模块:系统需要通过各种传感器(如温度计、湿度计、空气质量检测仪等)采集现场检测数据,并将其上传到系统中。 3. 数据处理模块:系统需要对采集的数据进行实时处理,主要包括数据清洗、数据分析和数据可视化等功能,以提供决策支持。 4. 智能巡检算法设计系统需要根据采集的数据,应用机器学习和深度学习等算法,对检测结果进行分析和判断,提高检测效率和准确性。 5. 数据存储和管理模块:系统需要将采集的数据存储在云端数据库中,并提供数据管理和查询功能,以方便用户使用。 6. 用户界面设计系统需要提供用户友好的界面,包括数据可视化、报表展示、异常预警等功能,以方便用户进行管理和决策。 7. 安全性设计系统需要考虑数据安全和隐私保护,包括数据加密、身份认证、权限管理等功能,以保障系统的安全性和稳定性。 综上所述,核酸检测智能巡检系统设计需要考虑多个方面,包括系统架构、数据采集、数据处理、智能算法、数据存储和管理、用户界面和安全性等,以满足用户的需求并达到预期的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值