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

后端设计

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 {
    
    @Autowired
    private TaskQueue taskQueue;
    
    @Autowired
    private CacheManager cacheManager;

    public void submitTask(CalculationTask task) {
        taskQueue.addTask(task);
    }

    @Async
    public 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 completed
    const result = await getResult(taskId);
    // Use the result
}

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

相关推荐
codeGoogle18 小时前
自研 IM 还是选择第三方 SDK?企业开发者应该如何权衡?
前端·后端·程序员
mifengxing18 小时前
LeetCode 41.缺失的第一个正数|Hard题O(n)+O(1)最优解法深度解析
java·算法·leetcode·排序算法
用户9385156350719 小时前
React Context 与自定义 Hook 从底层到实践:「跨层级通信 + 副作用封装」全解析
前端·javascript·react.js
滴滴答答哒19 小时前
VUE3+element-plus MultiSelect 多选下拉组件
前端·javascript·vue.js
其美杰布-富贵-李20 小时前
04 watch 与 Vue 响应式数据流
前端·javascript·vue.js
markinmarkin21 小时前
Spring 中Bean 的作用域有哪些?
java·后端·spring
赵大仁21 小时前
生成式 UI 实战:用 JSON Schema + React 动态渲染 AI 界面
前端·ai·react·next.js·前端架构·生成式ui
山荷枝1 天前
Java学习第十天
java·学习
kyriewen1 天前
我排查了一个React内存泄漏——罪魁祸首是这3个被忽略的清理函数
前端·javascript·面试
matlabgoodboy1 天前
计算机毕设代做|Java Python Matlab APP 全套开发设计
java·python·课程设计