ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

SpringCloud 项目遇到大数据场景解决方案

SpringCloud 项目遇到大数据场景解决方案 目录一、常见大数据业务场景二、分层解决方案1. 数据库层优化源头优化1.1 分库分表 Sharding‑JDBC / Sharding‑Proxy1.2 冷热分离1.3 索引优化、禁止 select *2. 查询加速异构索引存储ES3. 报表 统计分析剥离 OLAP 到 OLAP 引擎4. 大批量导出 / 大批量处理最容易 OOM方案 A异步导出生产最常用方案 B流式输出适合万级不算特别大的数据坑点5. 大数据量同步 消息处理6. 缓存层卸压 Redis三、架构分层总结SpringCloud 大数据参考架构四、不同量级选型参考五、开发避坑SpringCloud 项目高频踩坑六、结合你智慧充电项目举例SpringCloud 本身是微服务治理框架不自带大数据处理能力大数据压力一般体现在大查询返回、大批量导入导出、海量表数据查询、流式数据、数据库压力、内存 OOM、接口超时。下面按实战场景给出方案包含技术选型、落地思路、坑点。一、常见大数据业务场景前端分页查询千万级表直接查 DB 慢、超时批量导出几万 / 百万 Excel接口 OOM、GC大批量数据同步、迁移统计报表、聚合分析MQ 海量消息消费多表 join 大数据量MySQL 扛不住核心原则联机接口不要做大数据计算冷热分离查询与写分离同步改异步中间件卸压二、分层解决方案1. 数据库层优化源头优化1.1 分库分表 Sharding‑JDBC / Sharding‑Proxy适合单表千万级以上业务数据可按规则分片用户 id、时间Sharding‑JDBCJar 包集成进 SpringCloud 服务无中间件性能高适合中小分片量Sharding‑Proxy独立代理服务所有微服务统一访问代理统一管控适合多服务共用分片注意避免跨分片 join、跨分片 order by尽量分片键带入查询不要做全分片扫描。 搭配读写分离写走主库查询走从库分担读压力。1.2 冷热分离热数据近期存 MySQL冷数据归档到MySQL 归档表 / ClickHouse / Hive / 对象存储。 业务查询只查热库历史报表查冷存储联机接口禁止查冷数据。1.3 索引优化、禁止 select *大数据下回表非常昂贵大表禁止不走索引的全表扫描。2. 查询加速异构索引存储ES场景复杂条件检索、多维度筛选、海量数据列表查询MySQL 多条件查询很慢架构MySQL 作为主库Canal 监听 binlog同步数据到 Elasticsearch联机业务查询走 ES增删改落 MySQLCanal 做数据同步优点支持多条件、模糊、聚合、分页千万亿级检索性能好缺点数据最终一致性有短暂延迟要处理同步失败、数据补偿SpringCloud 服务只调用 ES不直接大查询 MySQLMySQL 只做事务写。如果是向量检索场景替换 ES 为专门向量库。3. 报表 统计分析剥离 OLAP 到 OLAP 引擎严禁微服务业务库 MySQL 做大量 sum、group by、大 join 统计会打垮业务库。方案Canal 同步业务数据到ClickHouse定时任务 / 数据同步做 ETL预聚合指标报表服务独立部署专门查询 ClickHouseSpringCloud 业务微服务只负责业务流程不做统计计算ClickHouse 适合海量日志、充电订单、交易记录统计聚合速度远高于 MySQL。4. 大批量导出 / 大批量处理最容易 OOM❌错误服务一次性把百万数据全部 load 到 JVM 内存组装 Excel 返回。方案 A异步导出生产最常用用户触发导出接口服务生成导出任务存入数据库返回任务 IDMQ 发送消息异步消费者独立线程池读取数据流式写入 Excel 到文件服务器MinIO完成后记录文件地址前端轮询任务状态完成下载文件数据库读取分页游标查询不要一次性加载全部数据到内存分批处理分批刷写磁盘。SpringCloud 注意异步消费者单独线程池和业务线程池隔离防止大数据任务拖垮正常业务。方案 B流式输出适合万级不算特别大的数据Servlet 流式响应一边读一边写输出流不把全量数据存在内存。百万级不推荐流式输出容易网络超时优先异步导出。坑点不要用 ArrayList 存全部结果集使用游标分页处理完一批释放一批。多线程导出不能多线程写同一个输出文件可以多线程读不同分片生成多个文件后合并。5. 大数据量同步 消息处理微服务之间大批量数据传输不要 http 一次性传巨大 body。RocketMQ/Kafka 做分片消息大数据集拆成分批小消息消费端分批处理。批量消费设置合理批量 size避免单条消息过大。消费端控制并发设置限流防止下游 DB 被打崩。海量数据迁移Canal MQ也可以 Spring‑Batch 做批处理任务。Spring‑Batch 可以集成进 SpringCloud专门做批处理读‑处理‑写支持 Chunk 分块容错、重启续跑。适合批量迁移、批量计算。6. 缓存层卸压 Redis高频重复大数据统计结果预计算存入 Redis接口直接读缓存。大数据结果不要存超大 value大集合拆成分片集合。定时更新缓存避免实时计算。三、架构分层总结SpringCloud 大数据参考架构前端请求 ↓ SpringCloud微服务业务逻辑不做大计算 ├─联机写MySQL主库 ├─联机查询ESCanal同步MySQL binlog ├─异步任务RocketMQ 异步导出、批量处理 ├─报表统计独立报表服务 → ClickHouse └─缓存Redis 归档冷数据MinIO / ClickHouse 定时任务XXL‑Job 执行批处理、预聚合、归档四、不同量级选型参考数据规模方案百万以内单表MySQL 优化 索引 分页必要 ES千万级单表Sharding‑JDBC 分表 ES 查询亿级Sharding‑Proxy冷热分离ClickHouse 做分析大批量导出MQ 异步导出 MinIO五、开发避坑SpringCloud 项目高频踩坑微服务 feign 调用不要传输超大报文大数据不要走 feign改用文件 / 消息。JVM 内存不要指望堆扛住百万对象一定流式、分批处理。批处理任务和业务服务线程池隔离防止大数据任务占满线程正常业务接口卡死。大数据查询禁止全分片扫描、禁止不带分片键查询分库分表。区分 OLTP 业务和 OLAP 分析业务库不跑统计 SQL。Canal 同步 ES 要做数据补偿机制处理同步丢失。六、结合你智慧充电项目举例充电订单海量上报实时充电业务写 MySQLCanal 同步订单数据到 ES用于订单列表复杂检索统计峰谷、营收报表同步到 ClickHouse历史旧订单做冷热归档订单导出走 MQ 异步导出任务不阻塞业务接口。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进