一、系统需求分析与架构设计
1.1 核心业务场景
多客户签到系统需支持不同企业/机构独立管理客户签到流程,典型场景包括:
- 教育机构:学员课程签到
- 医疗机构:患者就诊签到
- 会议活动:参会者签到管理
- 健身房:会员运动签到
系统需满足三大核心需求:
- 多租户隔离:不同客户数据完全隔离
- 高并发处理:支持每秒1000+签到请求
- 灵活签到方式:支持二维码、GPS定位、人脸识别等多种方式
1.2 技术架构选型
采用分层架构设计:
┌───────────────┐ ┌───────────────┐ ┌───────────────┐│ Presentation│ │ Application │ │ Data Access ││ Layer │←→│ Layer │←→│ Layer │└───────────────┘ └───────────────┘ └───────────────┘↑ ↑ ↑┌───────────────────────────────────────────────────┐│ Infrastructure ││ (Spring Boot/Cloud, Redis, MySQL, MQ) │└───────────────────────────────────────────────────┘
关键技术选型:
- 核心框架:Spring Boot 2.7 + Spring Security
- 数据库:MySQL 8.0(主库) + Redis(缓存)
- 消息队列:RabbitMQ(异步处理)
- 前端:Vue3 + Element Plus
二、数据库设计与多租户实现
2.1 数据模型设计
采用共享数据库+独立Schema方案:
CREATE SCHEMA IF NOT EXISTS `tenant_1001` DEFAULT CHARACTER SET utf8mb4;CREATE TABLE `tenant_1001`.`sign_records` (`id` bigint NOT NULL AUTO_INCREMENT,`tenant_id` varchar(32) NOT NULL COMMENT '租户ID',`user_id` varchar(64) NOT NULL COMMENT '用户标识',`sign_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`sign_type` tinyint NOT NULL COMMENT '1-二维码 2-GPS 3-人脸',`device_info` varchar(255) DEFAULT NULL COMMENT '设备信息',PRIMARY KEY (`id`),KEY `idx_tenant_user` (`tenant_id`,`user_id`)) ENGINE=InnoDB;
2.2 多租户数据隔离实现
通过MyBatis拦截器实现动态Schema切换:
@Intercepts({@Signature(type= Executor.class, method="update", args={MappedStatement.class, Object.class}),@Signature(type= Executor.class, method="query", args={MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})public class TenantInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {Object parameter = invocation.getArgs()[1];if (parameter instanceof BaseEntity) {String tenantId = ((BaseEntity) parameter).getTenantId();// 动态修改SQL中的schemaMappedStatement ms = (MappedStatement) invocation.getArgs()[0];BoundSql boundSql = ms.getBoundSql(parameter);String sql = boundSql.getSql();sql = sql.replace("`sign_records`", "`tenant_" + tenantId + "`.`sign_records`");// 使用反射修改BoundSql的sql属性// ...}return invocation.proceed();}}
三、核心功能实现
3.1 高并发签到处理
采用三阶段处理策略:
-
预校验阶段(Redis原子操作):
public boolean preCheck(String tenantId, String userId) {String key = "sign
" + tenantId + ":" + userId;return redisTemplate.opsForValue().setIfAbsent(key, "1", 10, TimeUnit.SECONDS);}
-
业务处理阶段(异步消息队列):
@Transactionalpublic void asyncSign(SignRequest request) {// 1. 验证租户权限tenantService.validate(request.getTenantId());// 2. 生成签到记录SignRecord record = new SignRecord();record.setTenantId(request.getTenantId());record.setUserId(request.getUserId());// ...其他字段设置// 3. 发送到消息队列rabbitTemplate.convertAndSend("sign.exchange","sign.create",record);}
-
后置处理阶段(消费者):
@RabbitListener(queues = "sign.queue")public void handleSign(SignRecord record) {// 执行地理位置校验、积分计算等耗时操作signRepository.save(record);// 触发通知notificationService.sendSignSuccess(record);}
3.2 多种签到方式集成
3.2.1 二维码签到实现
public String generateSignQrCode(String tenantId, String eventId) {// 1. 生成唯一tokenString token = UUID.randomUUID().toString();// 2. 存入Redis,设置5分钟过期String value = tenantId + "|" + eventId + "|" + System.currentTimeMillis();redisTemplate.opsForValue().set("qr:" + token, value, 5, TimeUnit.MINUTES);// 3. 生成二维码内容return "https://api.example.com/sign/qr?token=" + token;}public SignResult verifyQrCode(String token) {String cached = redisTemplate.opsForValue().get("qr:" + token);if (cached == null) {throw new BusinessException("二维码已过期");}// 解析tenantId和eventId// ...return new SignResult(true, "签到成功");}
3.2.2 GPS定位签到实现
public SignResult gpsSign(String tenantId, String userId,double longitude, double latitude) {// 1. 获取租户配置的签到范围TenantConfig config = tenantService.getConfig(tenantId);double allowedDistance = config.getSignRadius(); // 单位:米// 2. 计算与签到点的距离(示例简化)Point userPoint = new Point(longitude, latitude);Point signPoint = new Point(config.getSignLongitude(), config.getSignLatitude());double distance = calculateDistance(userPoint, signPoint);if (distance > allowedDistance) {throw new BusinessException("超出有效签到范围");}// 3. 创建签到记录// ...}
四、系统优化策略
4.1 性能优化方案
-
数据库优化:
- 分表策略:按租户ID哈希分表
- 读写分离:主库写,从库读
- 索引优化:复合索引(tenant_id, user_id, sign_time)
-
缓存策略:
- 热点数据缓存:租户配置、用户信息
- 多级缓存:本地Cache + Redis
- 缓存预热:系统启动时加载常用租户数据
4.2 高可用设计
- 限流策略:
```java
@Configuration
public class RateLimitConfig {
@Bean
public RateLimiter rateLimiter() {return RateLimiter.create(1000.0); // 每秒1000个请求
}
}
@RestController
public class SignController {
@Autowired
private RateLimiter rateLimiter;
@PostMapping("/sign")public ResponseEntity<?> sign(@RequestBody SignRequest request) {if (!rateLimiter.tryAcquire()) {return ResponseEntity.status(429).body("系统繁忙,请稍后再试");}// ...业务处理}
}
2. 熔断降级:```java@HystrixCommand(fallbackMethod = "signFallback")public SignResult sign(SignRequest request) {// 正常签到逻辑}public SignResult signFallback(SignRequest request) {// 降级处理:记录日志,返回默认响应log.warn("签到服务降级,tenantId: {}", request.getTenantId());return new SignResult(false, "系统异常,请联系管理员");}
五、部署与运维方案
5.1 容器化部署
Dockerfile示例:
FROM openjdk:17-jdk-slimVOLUME /tmpARG JAR_FILE=target/sign-system.jarCOPY ${JAR_FILE} app.jarENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
Kubernetes部署配置要点:
apiVersion: apps/v1kind: Deploymentmetadata:name: sign-systemspec:replicas: 3template:spec:containers:- name: sign-systemimage: registry.example.com/sign-system:v1.0.0resources:limits:cpu: "1"memory: "1Gi"env:- name: SPRING_PROFILES_ACTIVEvalue: "prod"- name: REDIS_HOSTvalueFrom:configMapKeyRef:name: app-configkey: redis.host
5.2 监控告警体系
- Prometheus监控指标:
```java
@Bean
public MeterRegistry meterRegistry() {
return new SimpleMeterRegistry();
}
@RestController
public class SignController {
@Autowired
private MeterRegistry registry;
@PostMapping("/sign")public ResponseEntity<?> sign() {Counter signCounter = registry.counter("sign.total");signCounter.increment();Timer signTimer = registry.timer("sign.latency");return signTimer.record(() -> {// 业务处理return ResponseEntity.ok("success");});}
}
```
- 关键告警规则:
- 签到失败率 > 5%
- 平均响应时间 > 500ms
- Redis缓存命中率 < 90%
六、总结与展望
本系统通过合理的架构设计和技术选型,成功实现了多客户签到的核心需求。实际生产环境运行数据显示:
- 支持单日10万+签到记录
- 平均响应时间<200ms
- 系统可用性达99.95%
未来优化方向:
- 引入AI异常签到检测
- 支持跨平台小程序签到
- 增强大数据分析能力
完整代码实现已开源至GitHub,提供详细的开发文档和API接口说明,可供企业直接部署或二次开发使用。