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原生能力实现,通过关系型数据库+定时任务调度机制,在保持系统简洁性的同时满足基本分布式计算需求。适合中小规模(日处理千万级以下)的离线计算场景,如需更高性能建议仍考虑引入专业分布式计算框架。
相关文章:
SpringBoot原生实现分布式MapReduce计算
一、架构设计调整 核心组件替换方案: 1、注册中心 → 数据库注册表 2、任务队列 → 数据库任务表 3、分布式锁 → 数据库行级锁 4、节点通信 → HTTP REST接口 二、数据库表结构设计 节点注册表 CREATETABLE compute_nodes (node_id VARCHAR(36)PRIMARYKEY,last_…...
可吸收聚合物:医疗科技与绿色未来的交汇点
可吸收聚合物(Biodegradable Polymers)作为生物医学工程的核心材料,正引领一场从“金属/塑料植入物”到“智能降解材料”的范式转移。根据QYResearch(恒州博智)预测,2031年全球可吸收聚合物市场销售额将突破…...
Java从入门到“放弃”(精通)之旅——抽象类和接口⑨
Java从入门到“放弃”(精通)之旅🚀——抽象类和接口⑨ 引言 在Java面向对象编程中,抽象类和接口是两个非常重要的概念。它们为代码提供了更高层次的抽象能力,是设计灵活、可扩展系统的关键工具。 🟦一、抽…...
游戏引擎学习第239天:通过 OpenGL 渲染游戏
回顾并为今天的内容做准备 今天,我想继续完成这部分内容,因为实际上我们已经完成了大部分工作,剩下的部分并不复杂。我计划今天完成这部分实现,至少是那些不涉及纹理的部分。正如昨天所说,纹理部分才是唯一比较复杂的…...
基于Python的多光谱遥感数据处理与分类技术实践—以农作物分类与NDVI评估为例
多光谱遥感数据包含可见光至红外波段的光谱信息,Python凭借其丰富的科学计算库(如rasterio、scikit-learn、GDAL),已成为处理此类数据的核心工具。本文以Landsat-8数据为例,演示辐射校正→特征提取→监督分类→精度评…...
数字空间与VR有什么关系?什么是数字空间?
数字空间与VR的关系 数字空间与虚拟现实(VR)之间存在着紧密而复杂的关系,它们相互影响、共同促进发展。为了深入理解这一关系,我们需要明确数字空间的基本概念及其与VR技术的相互作用。 数字空间的概念 数字空间,通常…...
navicat导入sql文件 所有问题解决方法集合
问题一:mysql导入大批量数据出现MySQL server has gone away的解决方法 方法一: 查看mysql max_allowed_packet的值 show global variables like max_allowed_packet;可以看到是64M(67108864/1024/1024) 调整为所需大小 例如我们需要调整为1024M(102…...
3、有Bluetooth,LCD,USB,SD卡,PSRAM,FLASH、TP等软硬件驱动开发经验优先考虑
首先,Bluetooth驱动开发经验。蓝牙是一种无线通信技术,广泛应用于设备之间的数据传输,比如耳机、键盘、智能家居设备等。驱动开发可能涉及底层协议的实现、与硬件的交互,以及确保兼容性和稳定性。需要了解蓝牙协议栈,如…...
【k8s】PV,PVC的回收策略——return、recycle、delete
PV 和 PVC 的回收策略主要用于管理存储资源的生命周期,特别是当 PVC 被删除时,PV 的处理方式。回收策略决定了 PV 在 PVC 被删除后的行为。 回收策略的类型 Kubernetes 提供了三种主要的回收策略,用于管理 PV 的生命周期: Reta…...
K8S探针的应用
目录: 1、探针的简介2、启用探针2.1、启用就绪探针2.2、启用存活探针2.3、启用启动探针(可选) 1、探针的简介 在Kubernetes中,探针(Probes)是用来检查容器健康状况的工具,它们帮助Kubernetes了…...
c++STL——stack、queue、priority_queue的模拟实现
文章目录 stack、queue、priority_queue的模拟实现使用部分模拟实现容器适配器deque的介绍原理真实结构deque的迭代器deque的操作deque的优缺点 stack的模拟实现按需实例化queue的模拟实现priority_queue的模拟实现为何引入仿函数代码实现 stack、queue、priority_queue的模拟实…...
【Redis】字符串类型List 常用命令详解
文章目录 1. 添加1.1 lpush - 从左或Rpush - 从右添加元素1.2 linsert - 插入新值到某个值前后 2. 获取2.1 lrange - 根据区间获取值2.2 lindex - 根据下标获取值2.3 llen - 获取列表的长度 3. 删除3.1 lpop - 移除最左或rpop - 最右的元素3.2 lrem - 移除指定的值3.3 rpoplpus…...
.NET仓储层在 using 块中创建 SqlSugarClient 的风险
如题,先看代码示例 using 块的使用 public ISugarQueryable<T> GetSet(Expression<Func<T, bool>> whereExpression null) {using (SqlSugarClient dbClient SqlSugarInstance.GetInstance()){var query dbClient.Queryable<T>();if (w…...
PowerQuery逆透视将二维表转换为一维表
PowerQuery逆透视将二维表转换为一维表 原因:为什么要转成一维表? 实例: 1.例如如果用二维表做占比图,我们需要将所有的指标列添加到值上,如图: 2.如果用一维表,我们只需要添加一个指标列和一…...
谐振模态图
t0时刻,原边Q6、Q7导通副边Q1、Q4导通 T1时刻,原边谐振回路电流,由负变正,过零点,副边绕组电流小于负载电流,输出电容放电 T2时刻,副边绕组电流等于负载电流,输出电容不充不放 T3时…...
Idea 配置 Git
1、下载Git 下载地址: Git - Downloading Package 2、win 打开 git bash ,配置邮箱和用户名 //配置邮箱 git config --global user.email "710419844qq.com" //配置全局用户名 git config --global user.name "smelodys" 3、ide…...
B + 树与 B 树的深度剖析
在数据库领域,B 树和 B 树是两种极为关键的数据结构,它们对于数据的存储、查询以及索引的构建等方面都有着深远的影响。深刻理解这两种树的原理、特性以及它们之间的差异,对于数据库的性能优化、数据组织和管理等工作具有不可替代的重要作用…...
MongoDB索引
一、索引核心价值 MongoDB索引通过构建高效查询路径,从根本上改变数据检索方式。当未建立索引时,数据库引擎被迫执行全集合扫描(COLLSCAN),如同在无序的书架上逐本查找目标书籍。通过建立索引,查询复杂度从…...
Docker--Docker网络原理
虚拟网卡 虚拟网卡(Virtual Network Interface,简称vNIC) 是一种在软件层面模拟的网卡设备,不依赖于物理硬件,而是通过操作系统或虚拟化技术实现网络通信功能。它允许计算机在虚拟环境中模拟物理网卡的行为࿰…...
Java 性能优化:如何在资源受限的环境下实现高效运行?
Java 性能优化:如何在资源受限的环境下实现高效运行? 在计算机系统中,性能优化是一项至关重要的任务,尤其是在资源受限的环境下,如何让 Java 程序高效运行是许多开发者面临的挑战。本文将深入探讨 Java 性能优化的策略…...
Spring之我见 - Spring MVC重要组件和基本流程
核心组件详解 前端控制器 - DispatcherServlet 作用:所有请求的入口,负责请求分发和协调组件。 public class DispatcherServlet extends HttpServlet {// 核心服务方法protected void doService(HttpServletRequest request, HttpServletResponse re…...
MongoDB常用命令
数据库操作 显示所有数据库 show dbs 切换/创建数据库 (如果数据库不存在则创建) use <database_name> 删除当前数据库 db.dropDatabase() 查看当前数据库 db 查看数据库状态 db.stats() 集合操作 显示当前数据库中的所有集合 show collections 创建集合 d…...
Java Set/List 知识点 Java面试 基础面试题
Java Set/List 知识点 Set与List区别 List 有序、值可重复,内部数据结构 Obejct[ ] 数组Set 无序、值不重复,内部数据结构 HashMap keyobject value固定new Object() ArrayList 有序存储元素允许元素重复,允许存储 null 值支持动态扩容非线程安全 HashSet、LinkedHa…...
C#委托介绍
委托可以将方法作为参数传递,同时委托也可以自己作为参数传递 委托可分为自定义委托delegate 无返回值的Action 与有返回值的Func委托 也有匿名委托与Lamada 委托支持多播是事件的基础 用处如在分线程调用主线程的UI invoke public delegate string Say(stri…...
三网通电玩城平台系统结构与源码工程详解(三):控制台与银商权限模块设计
本篇聚焦于三网通电玩城系统中的控制台管理系统及银商权限逻辑。通过深入解构后台系统的角色分权、账目明细管理、发卡接口与日志追踪机制,本文将提供完整的权限划分方案和部分关键实现代码,为平台运维与数据安全提供坚实基础。 一、控制台整体结构概览 …...
audio 核心服务AudioPolicyService 和AudioFlinger启动流程
目录 1、audioserver启动 2、AudioPolicyService启动 3、AudioFlinger启动 audio的核心服务有两个,AudioPolicyService 和AudioFlinger他们到在audioserver一个进程中 1、audioserver启动 设备开机,系统启动时将执行 /system/etc/init/audioserver.rc…...
Android自动化功能-使用Appium获取android页面节点元素信息
一、appium安装和使用 官方网站:https://appium.io/docs/en/latest/ github地址:https://github.com/appium/appium 安装步骤: 首先需要安装node.js 安装好node.js之后使用npm安装 appium npm install -g appium appium -v # 检查安装版本…...
springboot项目配置springMVC
为什么需要配置springMVC 在Spring Boot中配置Spring MVC,实际上是为了更好地集成和使用Spring框架提供的Web开发功能。 Spring Boot本身是为了简化Spring应用的配置和部署,它内置了一些默认的配置和组件,帮助开发者快速启动应用,…...
解决 MongoDB 查询中的 `InvalidMongoDbApiUsageException` 错误
您在使用 Spring Data MongoDB 时遇到了 InvalidMongoDbApiUsageException 异常,错误信息如下: “由于 com.mongodb.BasicDocument 的限制,您无法添加第二个 ‘null’ 条件。查询已经包含 ‘{ “KaTeX parse error: Expected }, got EOF at e…...
多模态知识图谱:重构大模型RAG效能新边界
当前企业级RAG(Retrieval-Augmented Generation)系统在非结构化数据处理中面临四大核心问题: 数据孤岛效应:异构数据源(文档/表格/图像/视频)独立存储,缺乏跨模态语义关联,导致知识检…...
基于大模型的贲门失弛缓症手术全流程风险预测与治疗方案研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与技术路线 二、贲门失弛缓症概述 2.1 定义与发病机制 2.2 临床表现与诊断标准 2.3 治疗现状与挑战 三、大模型预测原理与数据基础 3.1 大模型介绍与选择依据 3.2 数据收集与预处理 3.3 模型训…...
C语言内存函数
1.memcpy函数 1.1:memcpy函数的介绍 1.2:模拟实现memcpy函数 我实现的memcpy函数无法处理两块重叠的内存的数据的拷贝 #include<assert.h> void* my_memcpy(void* dest, const void* src,size_t num) {assert(dest ! NULL && src ! NULL);//从src指向的内存位…...
Uniapp:navigator(页面跳转)
目录 一、基本概述二、属性说明三、具体使用 一、基本概述 页面跳转。该组件类似HTML中的<a>组件,但只能跳转本地页面。目标页面必须在pages.json中注册。 二、属性说明 属性名类型默认值说明平台差异说明urlString应用内的跳转链接,值为相对路…...
建造者模式详解及其在自动驾驶场景的应用举例(以C++代码实现)
模式定义 建造者模式(Builder Pattern)是一种创建型设计模式,用于分步构造复杂对象。该模式将对象构建过程与其表示分离,支持通过相同构建过程生成不同表现形式,特别适合需要灵活配置的自动驾驶车辆系统搭建场景。 自…...
2025年数字媒体设计与文化交流国际会议 (DMACE 2025)
2025 International Conference on Digital Media Art and Cultural Exchange 【一】、大会信息 会议简称:DMACE 2025 大会地点:中国烟台 收录检索:提交Ei Compendex,CPCI,CNKI,Google Scholar等 【二】会议…...
【MCP Node.js SDK 全栈进阶指南】利用TypeScript-SDK打造高效MCP应用
前言 在MCP(模型上下文协议)的世界中,SDK(软件开发工具包)是开发者构建应用的重要工具。作为MCP生态中最活跃的SDK之一,TypeScript-SDK提供了简洁而强大的接口,帮助开发者快速构建高效的MCP应用。本文将带你深入了解MCP的TypeScript-SDK,掌握其核心概念和使用方法,让…...
LangChain4j 搭配 Kotlin:以协程、流式交互赋能语言模型开发
Kotlin 支持 | LangChain4j Kotlin 是一种面向 JVM(及其他平台)的静态类型语言,能够实现简洁优雅的代码,并与 Java 库无缝互操作。 LangChain4j 利用 Kotlin 扩展和类型安全构建器来增强 Java API,为其增添特定于 Ko…...
搜索引擎的高级语法
文章目录 精确搜索:双引号站内搜索:site通配符搜索:*减号缩小范围:-文档搜索:filetypeURL搜索: inurl标题搜索:intitle正文搜索:intext参考链接 精确搜索:双引号 “ ” …...
探秘 SenseGlove Nova 2力反馈手套,解锁 VR 键盘交互新方式
在虚拟现实(VR)技术不断发展的现今,键盘交互体验的优化成为众多科研人员关注的重点。今天,让我们一同走进 Heilbronn 大学与 SenseGlove 的合作项目,探寻 SenseGlove Nova 2 力反馈手套为 VR 环境中的键盘交互带来的新…...
品牌如何通过朝日新闻出海日本?——某企业日本媒体发稿实战
文 | 言同数字亚太传播实验室 一、日本市场的隐形门槛:中国品牌的三大痛点 案例背景: 某中国灵芝保健品企业(代号"ForestLife"),产品虽获中国/欧盟有机认证,但在日本市场面临: 认知…...
安全文件共享实际上是什么样的呢?
通过即时通讯应用共享敏感信息的安全漏洞由来已久,且令人担忧。很少有事件像最近曝光的美国高级政客通过热门即时通讯应用 Signal 泄露军事攻击计划那样引起公众关注。 此类备受瞩目的漏洞凸显了全球各组织迫切需要重新评估其安全交换机密数据的方法。对于许多机密…...
深入探索Spark-Streaming:从基础到核心编程
在大数据实时处理领域,Spark-Streaming凭借其强大功能脱颖而出。它是Spark生态系统中处理流式数据的利器,支持Kafka、Flume等多种数据输入源,能利用Spark的map、reduce等原语处理数据,处理结果可存储于HDFS、数据库等。 Spark-Str…...
深度学习3.6 softmax回归的从零开始实现
本章节引入3.5的数据集 import torch from IPython import display from d2l import torch as d2lbatch_size 256 #迭代器批量 train_iter, test_iter d2l.load_data_fashion_mnist(batch_size)3.6.1 初始化模型参数 num_inputs 784 # 权重矩阵长度 num_outputs 10 # 类别…...
使用Spark-TTS-0.5B模型,文本合成语音
文章目录 背景模型介绍拉取开源代码conda下载与使用项目环境配置修改部分代码文件进阶玩法小结背景 ~~~~ 由于本博主遇到了需要文本转语音的相关需求,经过多方面的调研和研究,市面上的实现这个需求的方法有很多,可以直接通过调取api的方式实现,文本转语音。也可以…...
08前端项目----升序/降序
升序/降序 vue实现升序/降序服务器处理 vue实现升序/降序 用vue实现升序/降序,以及css绘制三角形 <div class"sui-navbar"><div class"navbar-inner filter"><ul class"sui-nav"><li class"active"&g…...
Dataway在Spring Boot中的引入以及使用教程
Dataway是Hasor生态中的接口配置工具,能帮助开发者快速配置数据接口。它支持DataQL和SQL两种语言模式,可将SQL转换为DataQL执行,简化数据查询与交互,无需编写大量代码。接口配置完成后,可进行自测、冒烟测试࿰…...
百度搜索 API 相比于爬虫的效率提升、价格及如何注册使用
使用百度搜索 API 进行数据查询,相比于爬虫(selenium)速度提升的幅度取决于几个因素: 1. 摆脱页面渲染(Selenium) Selenium 通过控制浏览器来模拟用户行为,加载网页并渲染页面。每次请求都需要…...
Docker 中运行 JAR 文件
文章目录 步骤 1:准备文件结构步骤 2:编写 Dockerfile步骤 3:构建 Docker 镜像步骤 4:运行容器常见问题解决Q1:容器启动后立即退出Q2:时区不一致Q3:依赖外部服务(如MySQL)…...
MacOS 10.15上能跑大语言模型吗?
MacOS 10.15上能跑大语言模型吗? 下载安装Ollama运行大语言模型引申出的问题 MacOS 10.15.7(发布于2020年9月)作为已经发布了将近5年的系统版本能够运行当今流行的大语言模型吗?这篇文章简要介绍了在MacOS 10.15上通过Ollama运行d…...
分布式之易混淆概念
昨天写UE写的破防了,忘了写文章,今天补一下分布式的一些概念。😚 在软件架构领域,微服务、领域驱动设计(DDD)和分布式系统是三个高频且容易被混淆的概念。许多开发者误以为它们是“同一件事的不同说法”&a…...