张工(项目经理): 大家好,我们最近在开发数据中台系统时遇到了一个问题,就是如何快速且安全地从多个数据源下载大量数据。李工,你有什么想法吗?
李工(后端工程师): 我建议我们可以设计一个专门的数据下载模块,使用API接口来管理数据下载任务。这样可以方便控制并发数,提高效率。
王工(前端工程师): 那听起来很酷!不过,我们需要确保前端能够实时看到下载进度,这该怎么实现呢?
李工: 好问题!我们可以让API返回一个任务ID,前端可以通过轮询这个ID来获取下载状态。
张工: 那具体怎么实现呢?能给个代码示例吗?
李工: 当然可以。首先,这是我们的API接口定义:
// 定义下载任务接口
app.post('/api/download', async (req, res) => {
const taskId = generateTaskId();
downloadQueue.push({ taskId, url: req.body.url });
res.json({ taskId });
});
张工: 这个看起来不错。那任务队列是怎么工作的呢?
李工: 任务队列会按顺序处理每个下载任务,并且限制并发数,避免服务器过载。这是任务处理逻辑:
// 任务队列处理函数
const downloadQueue = [];
let activeDownloads = 0;
function processQueue() {
if (activeDownloads < MAX_CONCURRENT_DOWNLOADS && downloadQueue.length > 0) {
const task = downloadQueue.shift();
activeDownloads++;
downloadFile(task.url, task.taskId);
}
}
async function downloadFile(url, taskId) {
try {
const response = await axios.get(url, { responseType: 'stream' });
response.data.pipe(fs.createWriteStream(`./downloads/${taskId}.zip`));
setTimeout(() => {
activeDownloads--;
processQueue();
}, DOWNLOAD_DELAY);
} catch (error) {
console.error('Download failed:', error);
activeDownloads--;
processQueue();
}
}
王工: 很棒!前端可以通过轮询这个任务ID来查看状态。这个API返回的状态信息应该包括进度和完成时间。
李工: 是的,我们可以在每次任务更新时记录进度,并通过另一个API接口查询状态。
张工: 非常感谢,李工。有了这个模块,我们的数据中台系统将更加完善。
]]>