项目背景
此项目旨在推动成都市探索**超大城市社区发展治理新路**,由三个实验室负责三大内容
- 1、**研发社区阵地空间管理模块**:AI算法实现态势感知(如通过社区图片和视频、文本,对环境 空间质量、绿视率、安全感分数、压抑感分数等.....)
- 2、**社区服务机器人**:门禁控制、视频监控检测
- 3、**社区“微网实格”智慧管理综合服务平台**:党群服务、大数据管理、AI能力管理、与上面两 大块的集成
算法团队是怎么提供服务
1.通过提供AI模型和算法接口来为其他模块(如前端、后端、机器人系统)提供支持。
你是做什么的
- 数据库设计:设计 MySQL 关系型数据库,配置 多数据源(MySQL + HDFS + Redis+OSS),确保数据存储高效、稳定。
- 后端接口开发:基于 Spring Boot + MyBatis Plus 开发 RESTful API,处理用户请求,保证前后端数据交互流畅。
- 分布式存储 & 文件管理:基于 HDFS + Redis + 对象存储 设计 缓存策略,优化数据查询性能。
MySQL、Redis、HDFS存入什么数据
存储方式 | 用途 | 特点 |
---|---|---|
MySQL | 存储用户管理、社区服务管理、机器人状态管理、日志数据 | 适合需要事务处理的场景,确保数据的一致性和完整性 |
Redis | 存储用户认证信息、缓存热点数据(社区服务推荐、社区活动信息)、AI处理结果 | 适合用于高并发场景的缓存加速 |
HDFS | 存储 社区日志数据、AI 训练数据、监控视频 | 适合大规模顺序读写,兼容大数据处理 |
对象存储(OSS) |
存储 网格图片、用户上传文件 | 适合非结构化数据存储,支持 S3 API |
项目中用到的java多线程池、以及输入和输出的数据是什么、为什么不直接让算法团队去做
1.java数据处理流程
Java 负责视频流接入 & 并发管理
- 连接多个摄像头(HTTP/RTSP )。
- 用 线程池 处理多个视频流,避免阻塞。
- 进行 视频帧提取(如 1 秒 5 帧、RGB)。
- 将帧缓存到 HDFS 供 AI 读取。
AI 团队负责算法推理
- 读取 Java 提供的视频帧(通常是 Websocket 、REST API 或 Kafka)。
- 进行 目标检测 / 行为分析(如识别车辆、异常行为、火灾)。
- 生成分析结果(JSON结构数据)结果结构:包括帧ID、时间戳、行为类型、检测结果、置信度、定位信息等。
- WebSocket 将分析结果实时返回给 Java 后端
Java 负责存储 & 实时推送
- 处理 AI 结果(存入 MySQL / Redis)
- 通过 WebSocket 实时推送前端(ECharts 可视化)
- 触发告警(如异常行为时,调用通知系统)。
CompletableFuture作用于多线程池,
来异步处理视频帧,处理完后把结果存到 HDFS。
CountDownLatch
确保 所有视频帧处理完成 后再统一存储 AI 结果到 Redis。并通过 WebSocket 推送给前端。
{
"camera_id": "A15",
"timestamp": "2025-03-20T12:45:30",
"abnormal_behaviors": [
{
"behavior_type": "fight", // 异常行为类型
"confidence": 0.92,
"bbox": [150, 200, 80, 100], // 异常行为发生的位置
"start_time": "2025-03-20T12:40:00",
"end_time": "2025-03-20T12:45:00"
},
{
"behavior_type": "晕倒",
"confidence": 0.85,
"bbox": [400, 300, 50, 75],
"start_time": "2025-03-20T12:46:00",
"end_time": "2025-03-20T12:47:00"
}
]
}
2.针对存储在Redis里面的AI结果,该怎么处理?
- 对于分析结果,尤其是同一视频流中的多个帧,考虑将多个结果 批量 存储在一个列表。
- 对实时性要求高的事件(如火灾或异常行为检测结果),可以设置较短的缓存过期时间(10 分钟)对于某些不需要实时性的分析结果(如行为分析的总结报告),可以设置较长的过期时间(例如 1 天 或 1 周),或根据系统负载和存储需求灵活调整。
3.为什么不直接让算法团队处理?
算法团队关注AI模型,而非并发管理
- 他们的重点是优化模型准确率,但不擅长并发编程、线程管理。
- 让他们处理视频流,会导致 性能问题(线程不合理调度) 或 资源消耗过高。
高并发任务调度是后端的职责
- 需要处理 任务队列、资源分配、负载均衡,这些都属于 后端架构优化 的范畴。
- 例如:如果有 100 个摄像头,应该如何分配 CPU/GPU 资源?这些问题是后端工程师要解决的。
数据存储 & 预处理需要统一管理
- 视频流需要存储到 HDFS / Redis / MySQL,格式必须 标准化,否则算法团队的数据格式可能不一致。
- 日志 & 监控 也是后端管理的,确保任务执行过程中有完整的错误跟踪。
针对项目的并发请求的 QPS(Queries Per Second,查询每秒),要确保高效处理视频流
用户的关键信息有没有加密(电话、身份证)
MySQL 提供了内置的加密函数 AES_ENCRYPT
和 AES_DECRYPT
,可以用于对敏感数据进行加密和解密。这些函数适合加密小型数据,如手机号和身份证号。你需要提供一个加密密钥(对称密钥),该密钥用于加密和解密操作。
数据脱敏:对于用户敏感信息,如身份证号、手机号等,可以考虑在查询时对部分数据进行脱敏,只显示部分信息,如显示手机号的后四位或身份证号的最后 4 位。
AI训练的样本是什么?数据格式是什么?
- 样本:
- 视频数据、图片数据和文本数据
- 数据格式:
- 视频文件格式 MP4
- 帧数据:视频数据会被分解成一帧一帧的图像( JPEG)每一帧图像将作为一个样本输入到 AI 模型进行训练。
- 标签数据:
- 每帧图像/视频片段会附带相应的标签信息,例如:
- 目标检测:框选人或物体的坐标(如边界框坐标)。
- 行为分析:检测到的动作(如行走、跑步、聚集等)或异常行为的类型(如打斗、跌倒)。
- 时间标签:每个视频帧的时间戳,用于表示图像的顺序。
- 每帧图像/视频片段会附带相应的标签信息,例如:
HDFS从AI模型那里拿数据,返回结果是什么
- 数据存储:AI 模型训练的数据存储在 HDFS 中。
- 读取数据:AI 团队使用 Hadoop API 或 PySpark 从 HDFS 中读取数据进行训练。
- 模型训练与保存:使用深度学习框架进行模型训练,训练结果(包括模型文件、性能评估)可以存储在 HDFS 中。
- 返回结果:训练后的模型可以用于后续的推理任务,并将推理结果传递到前端展示或用于进一步分析。
你在项目里面有什么收获、用到了哪些技能
- 大数据与分布式存储:通过与 HDFS 的集成,了解了如何处理大规模数据的存储和管理,并提高了对大数据存储与处理技术的理解。
- 实时数据流处理:在视频流的实时处理上,掌握了如何使用 Java 多线程、线程池等技术高效地处理并行数据流,解决高并发下的数据处理问题。、
针对智慧社区这个项目,如果让你来测试,有什么思路和流程
针对智慧社区项目的测试,我会从功能测试、性能测试、安全测试、兼容性测试、稳定性测试五个方面进行系统性测试,确保整个系统的可靠性和稳定性。
1.功能测试:验证各模块是否正常工作。
用户管理模块
账号注册/登录(正确账号、错误账号、SQL 注入)
JWT 令牌认证是否生效
权限管理(普通用户、管理员权限区分)
性能测试:测试 QPS、AI 计算能力、WebSocket 并发。
大数据管理与可视化
WebSocket 是否能正确推送实时数据
ECharts 图表能否正常展示数据
Redis 缓存是否能正确存取分析结果
2.性能测试:测试 QPS、AI 计算能力、WebSocket 并发。
压力测试
使用 JMeter 或 Locust 模拟 1000+ 用户同时访问系统,观察 MySQL、Redis、HDFS 负载
测试 WebSocket 并发能力,查看推送延迟
QPS(每秒查询数)测试
重点测试 视频帧处理能力(每秒可处理多少帧)
数据库查询性能,如 Redis 每秒查询量、MySQL 查询优化(索引)
3.安全测试:重点关注用户数据、接口、存储安全。
用户数据加密
检查 MySQL 身份证号/手机号是否加密存储(AES 加密)
确保 JWT 令牌不能被篡改
HDFS 安全
访问控制(确保 AI 团队只能访问特定目录)
防止恶意上传大文件
WebSocket 安全
确保 WebSocket 连接是加密的
防止 WebSocket 消息篡改
4.兼容性测试:确保前端/网络环境兼容性。
前端适配性
适配 PC / 移动端
兼容 Chrome / Firefox / Edge / Safari
网络环境测试
测试 4G / 5G / WiFi 环境下 WebSocket 是否能稳定推送数据
模拟高丢包、弱网环境,看 WebSocket 断线重连能力
5.稳定性测试:确保系统长时间稳定运行,不因错误崩溃。
长时间运行测试
让系统连续运行 72 小时,观察 CPU / 内存占用
确保 WebSocket 不会断连
错误恢复测试
模拟 HDFS 宕机,看 Java 端如何处理
Redis 数据丢失,看系统是否能自动恢复
AI 服务器异常,检测 Java 是否能重试或降级处理
针对项目中,文件的上传和下载用的什么方法,怎么传输,对大小有限制吗?
HDFS 默认使用 FileSystem
API 进行文件上传和下载,这种方式是 单线程、串行 IO,所以在 大文件 或 高并发请求 场景下会比较慢。
Nginx + 多线程 + 线程池
Nginx 反向代理,使用 BufferedInputStream 进行流式传输
上传步骤:
针对小于10MB
- Nginx 作为静态资源服务器,先接收前端上传的文件,减少 HDFS 直接写入的压力。
- 后端(Spring Boot)从 Nginx 读取文件流,并用 BufferedInputStream 进行高效 IO 读取。
- 使用多线程并发写入 HDFS,避免单线程写入慢的问题。
针对大于10MB
- 使用多线程(线程池)优化并发上传 对于大文件上传(>10MB),可以使用多线程并行写入 HDFS,提高吞吐量。
下载步骤:
针对小于10MB
下载文件时,不直接访问 HDFS,而是让 Nginx 缓存静态文件
客户端先访问 Nginx,如果 Nginx 没有缓存,则从 HDFS 读取
针对大于10MB
- 多线程下载:同样可以使用
ExecutorService.submit()
,并行读取多个块,提升下载速度。
加密对应哪一层加密
加密层级 | 加密方案 | 适用数据 |
---|---|---|
传输层 | HTTPS / TLS | 客户端 ⇄ 服务器 / 服务器 ⇄ HDFS |
数据库层 | 哈希加密(用户密码)AES 加密存储(用户手机号、身份证) | |
HDFS 层 | HDFS 加密区(2.6+提供) | AI 训练数据、监控视频 |
Redis 层 | Redis TLS 加密(默认) | AI 识别结果 |
Mysql相关的知识
用户管理
根据你的项目架构,数据库主要涉及以下几张核心表:
1.1 用户管理(users)
字段名 | 类型 | 说明 | 备注 |
---|---|---|---|
id | BIGINT | 用户 ID | 主键,自增 |
username | VARCHAR(50) | 用户名 | 唯一索引 |
password | VARCHAR(255) | 密码 | 采用 BCrypt/AES 加密 存储 |
phone | VARCHAR(20) | 手机号 | AES 加密存储 |
role | ENUM('admin', 'user', 'robot') | 用户角色 | |
created_at | DATETIME | 注册时间 |
1.2 设备管理(devices)
字段名 | 类型 | 说明 |
---|---|---|
id | BIGINT | 设备 ID(主键) |
device_name | VARCHAR(100) | 设备名称 |
device_type | ENUM('camera', 'sensor', 'robot') | 设备类型 |
location | VARCHAR(255) | 设备所在位置 |
status | ENUM('online', 'offline', 'error') | 设备状态 |
created_at | DATETIME | 创建时间 |
1.3 AI 任务调度(ai_tasks)
字段名 | 类型 | 说明 |
---|---|---|
id | BIGINT | 任务 ID |
user_id | BIGINT | 触发任务的用户 |
task_type | ENUM('face_recognition', 'behavior_analysis') | 任务类型 |
status | ENUM('pending', 'running', 'completed', 'failed') | 任务状态 |
created_at | DATETIME | 任务创建时间 |
completed_at | DATETIME | 任务完成时间 |
1.4任务结果存储(ai_results)
字段名 | 类型 | 说明 |
---|---|---|
id | BIGINT | 结果 ID |
task_id | BIGINT | 关联的任务 ID |
result | TEXT | AI 识别结果(JSON 格式) |
created_at | DATETIME | 结果生成时间 |
1.5日志存储(logs)
字段名 | 类型 | 说明 |
---|---|---|
id | BIGINT | 日志 ID |
user_id | BIGINT | 关联用户 |
action | VARCHAR(255) | 操作类型 |
timestamp | DATETIME | 记录时间 |
2. 左右邻接(树状结构存储)
如果你的项目涉及到 设备分层 或 组织结构(如 社区楼栋 → 单元 → 房间),可以使用 邻接表模型(Adjacency List) 或 嵌套集模型(Nested Set)。
2.1 邻接表模型(Adjacency List)
示例数据:
id | name | parent_id |
---|---|---|
1 | 小区A | NULL |
2 | 楼栋1 | 1 |
3 | 单元1 | 2 |
4 | 房间101 | 3 |
项目用到的工具:
Postman:检查接口是否可行
JMeter:模拟多线程并发请求