设计前后端系统以处理长时间运行的计算任务并提供缓存支持

news/2024/11/14 12:40:57/

后端设计

1. 任务队列

创建一个任务队列来存储提交的计算任务。

@Component
public class TaskQueue {private final Queue<CalculationTask> queue = new LinkedList<>();public synchronized void addTask(CalculationTask task) {queue.add(task);}public synchronized CalculationTask getNextTask() {return queue.poll();}
}
2. 计算服务
@Service
public class CalculationService {@Autowiredprivate TaskQueue taskQueue;@Autowiredprivate CacheManager cacheManager;public void submitTask(CalculationTask task) {taskQueue.addTask(task);}@Asyncpublic void processTasks() {while (true) {CalculationTask task = taskQueue.getNextTask();if (task != null) {Result result = performCalculation(task);cacheManager.put(task.getId(), result);}}}public Result getResultFromCache(String taskId) {return cacheManager.get(taskId);}private Result performCalculation(CalculationTask task) {// Perform long-running calculation here// ...return new Result();}
}
3. 缓存管理器
@Component
public class CacheManager {private final Map<String, Result> cache = new ConcurrentHashMap<>();public void put(String key, Result result) {cache.put(key, result);}public Result get(String key) {return cache.get(key);}
}

前端设计

1. 提交任务

前端通过API提交计算任务,并获取一个任务ID

async function submitTask() {const response = await fetch('/submitTask', {method: 'POST',body: JSON.stringify({ /* task data */ }),headers: {'Content-Type': 'application/json'}});const data = await response.json();const taskId = data.taskId;return taskId;
}
2. 获取结果

前端通过任务ID获取计算结果。

async function getResult(taskId) {const response = await fetch(`/getResult?taskId=${taskId}`);const data = await response.json();return data.result;
}
3. 使用缓存
async function handleTask() {const taskId = await submitTask();// Poll or use a WebSocket to check if the task is completedconst result = await getResult(taskId);// Use the result
}

这个设计方案通过任务队列、异步处理和缓存管理器实现了任务提交、计算和结果缓存前端可以通过任务ID来轮询或使用WebSocket来检查任务是否完成,并从缓存中获取结果,从而减少计算时间和资源消耗。


http://www.ppmy.cn/news/1435492.html

相关文章

【数据结构】树和森林(树和森林的存储结构、树森林二叉树的转换、树和森林的遍历

5.树和森林 5.1 树的存储结构 树的逻辑结构 树是n个结点的有限集合。n0时称为空树。 在任意一棵非空树中应满足&#xff1a; 1&#xff09;有且只有一个特定的根结点&#xff1b; 2&#xff09;当n>1&#xff0c;其余结点可分为m个互不相交的有限集合&#xff0c;每个集合本…

【CSS】CSS实现元素逐渐消失(实现元素透明逐渐消失/模糊)

mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 10%);mask-image 属性用于定义一个遮罩&#xff0c;它可以隐藏元素的一部分或全部内容。在这个示例中&#xff0c;我们使用 mask-image 属性来定义一个线性渐变的遮罩&#xff0c;使得列表项的内…

目标检测YOLO数据集的三种格式及转换

目标检测YOLO数据集的三种格式 在目标检测领域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;算法是一个流行的选择。为了训练和测试YOLO模型&#xff0c;需要将数据集格式化为YOLO可以识别的格式。以下是三种常见的YOLO数据集格式及其特点和转换方法。 1. YOL…

Ubuntu查看端口状态

完蛋了&#xff0c;好像动心了&#xff0c;近一周吃啥东西都索然无味&#xff0c;这可如何是好&#xff01;&#xff01;&#xff01;不知道在期待什么&#xff0c;恐惧与窃喜—— 在Ubuntu系统中&#xff0c;查看某个端口是否被放行&#xff08;即允许流量通过&#xff09;&am…

机器学习/算法工程师面试题目与答案-数学基础部分

机器学习/算法工程师面试题目--数学基础部分 一、数学基础1、微积分SGD,Momentum,Adagard,Adam原理L1不可导的时候该怎么办sigmoid函数特性 2、统计学&#xff0c;概率论求 Max(a, b) 期望拿更长的玫瑰花的最好策略最大化工作天数的员工数切比雪夫不等式随机截成三段组成三角形…

企业微信hook接口协议,根据用户id批量获取详细信息

根据用户id批量获取详细信息 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid": "3240fde0-45e2-48c0-90e8-cb098d0ebe43","vids":[7881302555913738,1688853794914376] } 返回示例 {&…

【python】一文摸透python常用模块(一)

【python】一文摸透python常用模块 【先赞后看养成习惯】求点赞+收藏+关注😀 文章目录 【python】一文摸透python常用模块(一)OS模块(1)创建一个新的目录os.mkdir(2)列出当前目录下的所有文件和子目录os.listdir(3)遍历一个目录及其所有子目录os.walk(4)拼接文件…

基于springboot+vue+Mysql的漫画网站

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…