当前位置: 首页 > backend >正文

SpringBoot原生实现分布式MapReduce计算

一、架构设计调整

核心组件替换方案:

1、注册中心
→ 数据库注册表
2、任务队列
→ 数据库任务表
3、分布式锁
→ 数据库行级锁
4、节点通信
→ HTTP REST接口

二、数据库表结构设计

 节点注册表
CREATETABLE compute_nodes (node_id VARCHAR(36)PRIMARYKEY,last_heartbeat TIMESTAMP,statusENUM('ACTIVE','DOWN')
);
-- 任务分片表
CREATETABLE task_shards (shard_id INTAUTO_INCREMENTPRIMARYKEY,data_range VARCHAR(100),-- 例如:1-10000statusENUM('PENDING','PROCESSING','COMPLETED'),locked_by VARCHAR(36),locked_at TIMESTAMP
);

三、核心实现代码

1. 节点自注册实现

@Scheduled(fixedRate =3000)
public void nodeRegistration(){jdbcTemplate.update("INSERT INTO compute_nodes VALUES (?, NOW(), 'ACTIVE') "+"ON DUPLICATE KEY UPDATE last_heartbeat = NOW()",nodeId);// 清理过期节点jdbcTemplate.update("DELETE FROM compute_nodes WHERE last_heartbeat < ?",LocalDateTime.now().minusSeconds(10));
}

2. 任务分片抢占式调度

@Scheduled(fixedDelay =1000)
public void acquireTasks(){List<Long> shardIds = jdbcTemplate.queryForList("SELECT shard_id FROM task_shards "+"WHERE status = 'PENDING' "+"ORDER BY shard_id LIMIT 5 FOR UPDATE SKIP LOCKED",Long.class);shardIds.forEach(shardId ->{int updated = jdbcTemplate.update("UPDATE task_shards SET status = 'PROCESSING', "+"locked_by = ?, locked_at = NOW() "+"WHERE shard_id = ? AND status = 'PENDING'",nodeId, shardId);if(updated >0) processShard(shardId);});
}

3. Map阶段分布式处理

public void processShard(Long shardId){try{DataRange range =getDataRange(shardId);List<Record> records =fetchData(range);Map<String, Double> partialResult = records.parallelStream().collect(Collectors.groupingBy(Record::getCategory,Collectors.summingDouble(Record::getAmount)));saveResult(shardId, partialResult);markShardCompleted(shardId);}catch(Exception e){releaseShard(shardId);}
}

4. Reduce阶段聚合实现

public Map<String, Double> reduceAllResults(){return jdbcTemplate.query("SELECT category, SUM(amount) AS total "+"FROM map_results GROUP BY category",(rs, rowNum)->newAbstractMap.SimpleEntry<>(rs.getString("category"),rs.getDouble("total"))).stream().collect(Collectors.toMap(Entry::getKey,Entry::getValue));
}

四、关键优化点

1. 分片锁优化策略

// 使用乐观锁避免长时间占用连接
public boolean tryLockShard(Long shardId) {return jdbcTemplate.update("UPDATE task_shards SET version = version + 1 " +"WHERE shard_id = ? AND version = ?",shardId, currentVersion) > 0;
}

2. 结果缓存优化

@Cacheable(value ="partialResults", key ="#shardId")
public Map<String, Double> getPartialResult(Long shardId){return jdbcTemplate.query(...);
}// 配置类启用缓存
@Configuration
@EnableCaching
publicclassCacheConfig{@Beanpublic CacheManagercacheManager(){return new ConcurrentMapCacheManager();}
}

3. 分布式事务处理

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void markShardCompleted(Long shardId) {jdbcTemplate.update("UPDATE task_shards SET status = 'COMPLETED' " +"WHERE shard_id = ?", shardId);eventPublisher.publishEvent(new ShardCompleteEvent(shardId));
}

五、部署架构对比

在这里插入图片描述

六、性能压测数据

测试环境:
100w数据
在这里插入图片描述

七、生产级改进建议

分片策略优化

// 采用跳跃哈希算法避免热点
public List<Long> assignShards(int totalShards) {return IntStream.range(0, totalShards).mapToObj(i -> (nodeHash + i*2654435761L) % totalShards).collect(Collectors.toList());
}

动态分片扩容

@Scheduled(fixedRate =60000)
public void autoReshard(){int currentShards = getCurrentShardCount();int required = calculateRequiredShards();if(required > currentShards){jdbcTemplate.execute("ALTER TABLE task_shards AUTO_INCREMENT = "+ required);}
}

结果校验机制

public void validateResults() {jdbcTemplate.query("SELECT shard_id FROM task_shards WHERE status = 'COMPLETED'", rs -> {Long shardId = rs.getLong(1);if(!resultCache.contains(shardId)) {repairShard(shardId);}});
}

该方案完全基于SpringBoot原生能力实现,通过关系型数据库+定时任务调度机制,在保持系统简洁性的同时满足基本分布式计算需求。适合中小规模(日处理千万级以下)的离线计算场景,如需更高性能建议仍考虑引入专业分布式计算框架。

http://www.xdnf.cn/news/1078.html

相关文章:

  • Java高频面试之并发编程-05
  • 新能源汽车可视化大屏系统毕业设计
  • Node.js 模块导入的基本流程
  • 【Harmony】常用工具类封装
  • Jupyter Notebook 中切换/使用 conda 虚拟环境的方式(解决jupyter notebook 环境默认在base下面的问题)
  • Python爬虫从入门到实战详细版教程Char01:爬虫基础与核心技术
  • 【网络】代理服务器收尾及高级IO
  • vue项目中axios统一或单独控制接口请求时间
  • WPS Office安卓版云文档同步速度与PDF转换体验测评
  • 音视频小白系统入门课-3
  • 媒体发稿攻略,解锁新闻发稿成长新高度
  • 双指针-11.盛水最多的容器-力扣(LeetCode)
  • vue作业-周报管理系统
  • python 执行顺序
  • 程序员学商务英文之Terms of Payment Packing
  • 日志文件太大,如何分卷压缩便于传输
  • pwm驱动呼吸灯
  • 【NCCL】transport建立(一)
  • Express项目实战大事件后台 API 项目(五)——文章管理
  • java集合框架day1————集合体系介绍
  • 服务器监控软件推荐
  • Python Cookbook-6.7 有命名子项的元组
  • RAG vs 微调:大模型定制化技术选型全解析
  • 10、Context:跨维度传音术——React 19 状态共享
  • 【Java核心技术卷Ⅰ-第11版学习-第3章-Java的基本程序设计结构】
  • 每日一题(9) 垃圾箱分布
  • 基于SpinrgBoot+Vue的智慧农业管理平台-031
  • 远程医疗系统如何有效防护CC攻击
  • 智慧教室电子班牌-智能管理系统源码,‌后端‌基于Spring Boot框架,前端‌使用Vue.js框架进行组件化开发
  • 在python中装饰器的使用