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

后端设计

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来检查任务是否完成,并从缓存中获取结果,从而减少计算时间和资源消耗。

相关推荐
灵感__idea2 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
yinuo3 小时前
轻松接入大语言模型API -04
前端
袋鼠云数栈UED团队4 小时前
基于 Lexical 实现变量输入编辑器
前端·javascript·架构
cipher4 小时前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
UrbanJazzerati4 小时前
非常友好的Vue 3 生命周期详解
前端·面试
AAA阿giao4 小时前
从零构建一个现代登录页:深入解析 Tailwind CSS + Vite + Lucide React 的完整技术栈
前端·css·react.js
兆子龙5 小时前
像 React Hook 一样「自动触发」:用 Git Hook 拦住忘删的测试代码与其它翻车现场
前端·架构
兆子龙6 小时前
用 Auto.js 实现挂机脚本:从找图点击到循环自动化
前端·架构
SuperEugene6 小时前
表单最佳实践:从 v-model 到自定义表单组件(含校验)
前端·javascript·vue.js
昨晚我输给了一辆AE866 小时前
为什么现在不推荐使用 React.FC 了?
前端·react.js·typescript