前言
队列在服务端日常开发中是一种常用的数据结构,个人在日常开发中以下几种情况使用过:
- 任务调度 队列可以用于调度和执行异步任务,确保任务按照特定顺序执行。这在处理后台作业、定时任务和事件处理等方面非常有用。
- 消息传递 队列在消息传递系统中扮演重要角色,确保消息按照先进先出(FIFO)的原则进行处理。例如,消息队列可以用于解耦生产者和消费者,处理异步消息通信。
- 事件驱动 在事件驱动架构中,队列常用于存储和处理事件。当某个事件发生时,将其放入队列中,然后异步处理队列中的事件,确保事件按照正确的顺序执行。
- 数据缓冲 队列可以用作数据缓冲区,用于管理和处理大量数据。例如,生产者可以将数据放入队列,而消费者则异步从队列中取出数据进行处理。
因为数据量不大基本队列的存储都直接放到内存中, 本人常用的nodejs的fastq来实现,本文简单介绍下fastq的使用以及队列的执行流程
fastq队列的整个执行流程
graph TD
定义任务队列全局对象 --> 新增任务请求 --> 任务队列新增该任务 --> 执行该任务 --> 任务执行中 --> 执行中时触发新增多个任务请求 --> 任务队列按照请求顺序放入队列 --> 执行中的任务完成 --> 任务队列自动抛出该任务 --> 执行队列中下一个任务如此循环
fastq的使用(按队列执行编译任务)
- 引入fastq包
- 定义需要执行的任务方法
- 定义队列增加任务方法
# queue.js
const fs = require('fs');
const fastq = require('fastq');
const process = require("child_process");
const excuteBuildTask = (arg, cb) => {
console.log('buildQueue------: ', buildQueue.getQueue());
const time = Date.now();
console.log('time: ', time);
process.exec("npm run build",(error,stdout,stderr)=>{
console.log('stdout: ', stdout);
if(error){
cb(error);
return
}
cb(null, "build successfully!")
})
}
const buildQueue = fastq(excuteBuildTask, 1)
console.log('buildQueue-222-----: ', buildQueue.getQueue());
const addBuildTask = (task) => {
console.log('task: ', task);
buildQueue.push(task, function (err, result) {
if (err) { throw err }
console.log('the result is', result)
})
}
module.exports = { addBuildTask };
- 需要执行任务的代码中引入增加任务的方法动态增加任务
# build.js
const {addBuildTask} = require('./index');
console.log(process.argv);
const startBuild =()=>{
const taskId = process.argv[2] || 1;
addBuildTask(taskId)
}
startBuild()
fastq只适用于轻量级任务队列,数据量不大,及及时性稳定性要求不高的并发处理,因为fasqt的数据都是保存在内存中如果任务的数据过大会影响到整个服务的性能,另外还存在服务意外出错当前任务队列不会及时保存等问题。