在前端开发中,如果需要处理后端的异步任务,一般使用消息队列进行解耦。消息队列通常分为两种:基于容器的消息队列和分布式消息队列。基于容器的消息队列如 RabbitMQ、Kafka 等,提供一些可用的容器进行消息的传输、存储和处理。而分布式消息队列如 Redis、RocketMQ、ActiveMQ 等,更关注分布式的消息处理和存储。
在 Node.js 核心模块中,提供了类似于基于容器的消息队列的模块——Cluster 模块,但对于 Node.js 一直致力于解决的分布式问题而言,它并不能满足要求。因此,在 Node.js 社区中,在 Cluster 模块的基础上,诞生了一些分布式的消息队列框架,如「Kue」。而使用框架进行开发,有时过于繁琐,不少开发者遇到了瓶颈。Egg.js 就应运而生,它提供了一套插件式的前端解决方案,其中包含了「Egg-Kue」这个非常优秀的分布式消息队列框架。
在本篇文章中,我们将会详细介绍 npm 包「egg-kue」的使用教程,并为您带来深度的学习和指导意义。
Egg-Kue 简介
Egg-Kue 是一个在 Egg.js 中使用的分布式任务处理系统,它的实现依赖于 Kue。Egg-Kue 使用 Redis 作为消息队列存储后端,redis 提供了丰富的命令来操作消息队列。如果你想要极简的使用 Kue, 且没有更高级的需求,直接使用 Kue 应该是绰绰有余了。
Egg-Kue 的 API 已经被 EGG 封装了,使用起来比 Kue 更加友好和简化,这里我们只需要添加相关配置即可,Egg 对于 Kue 的使用是通过下面的 json 配置来实现的:
-- -------------------- ---- ------- - ---- - -- --- ---- ---- ----- -- ----- --- ------- - ------- ------- -------- --------- -- -- --- ---- -- ----- -- -- -------------------------------------- --- - -- ------- ------- ----- -- ------- ------- - ------- --------- - -- -- --- -------- ------ - ----- -------------- ----- ---- ----- -------------- ----- ------- ---- ---- -- -- ------------ ---- - -- ----------- ------------- - ---------------------- - - - -
Egg-Kue 的基本用法
安装
Node.js 仅仅支持单进程模型,对于后端的异步处理和异步任务,Node.js 提供了一些解耦的方案。开发一个小的应用可以自己内部控制,但在大型应用中,你需要把应用拆分成多个相互独立的模块,进行无限扩展和协作。消息队列做的就是这件事情。
首先需要在我们的项目中安装 Egg-Kue:
npm i egg-kue --save
配置
- 控制台命令使用
为了方便进行任务的操作和查看,支持使用 shell 命令查看任务列表、添加任务、删除任务等。你需要配置一下套件的信息。
-- -------------------- ---- ------- -- ------------------------ ----------- - - ---- ----- -- ---- --- -- ------- --- -- --- --------------------- --- ---- ------- ---- -- -- ----- ------- --- ----- --------- -- --- ------- --------- ------ - --------- -------- --------- -------- - --
- XML 配置
在 Egg 框架中,我们可以通过 config/config.default.xml 这个文件来配置,这要求你的应用需要支持 xml 解析,这里在配置 XML 格式文件的基础上提供一个 example.js 转换使用 JSON 格式。具体转化过程请看「example.js」源码,或者参考 Gulpfile.babel.js。使用 XML 配置文件编写:
-- -------------------- ---- ------- ----- ------------- ------------------ ----- ------------ -------------------- --------------------- ------- -------------------------- -------------------------- -------- ------
- XSS 配置
在上述配置中,你可能会遇到关于 XSRF 或 XSS 方面的问题,请参考配置方案:
-- -------------------- ---- ------- -- ------------------------ ---------------- - - ----- - ----------- ----- -- ---- - ------- ------ ------- - -------------- --- ------------- --- ------------ --- -- -- -------------- - ------- ------ -- -
重点注意:安全措施一般是全局开启配置,所以如果你的应用同时使用了 Egg-Kue 和 Egg,一定要合理地整合使用两个框架的安全组件,请考虑:
- csrf 配置
- XSS 配置
- CSP 配置
基本操作
Egg-Kue 的使用非常简单,我们只需要从 app.kue
中获取 kue 对象,然后对其进行操作即可:
-- -------------------- ---- ------- -- ------ ----- - ---- ------ - - --------------- ----- ----------- - ---------------- - -------- - ---- --------------------------- -- -- - ---------------- ---------- --- - ----- ----------- - ----- ------------------ ----- ----- - --- --- ---- - - -- - -- --- ---- - ------------ ------ ----- - -- ----- --- ------- ------ -- --- - ----- ----- - ----------- ----- -------- - -------------- -- -------------------- ----- ----------------------- -------- -- ----- ---------------------- --------------------- ----- ----- -- - ---------------------- ------- --- - - -------------- - ------------
需要注意的是,Kue 任务的运行是基于 redis 的,所以在启动任务前一定要先启动 redis 服务。
Kue API
Egg-Kue 对 Kue 进行了简化,移除了无需使用的方法,同时支持自定义 Kue 对象。
在此做一下简化的 API 列表:
start
启动 Kue 组件。
await Kue.start(queueOptions, popInterval);
queueOptions
: 可选,kue 队列客户端配置信息,详见 Kue 官方文档,默认是{}
。popInterval
: 可选,kue 消费消息的频率,默认是5s
。
create
基于 job 创建一个任务。
const jobId = await app.kue.create(queue, type, data) .backoff(backoff) .delay(delay) .priority(priority) .removeOnComplete(removeOnComplete) .save() .id;
queue
: 必选,队列名称。type
: 必选,任务类型。data
: 必选,任务数据。backoff
: 可选,是否使用指数后退重试。默认是{type:'exponential', delay: 5*1000}
。delay
: 可选,任务延迟到什么时间开始处理。默认是0ms
。priority
: 可选,任务优先级和执行顺序,默认为min
。removeOnComplete
: 可选,任务完成之后是否自动删除。默认为false
。
process
开启任务的消费函数。
const callback = async (job, done) => { // TODO: 处理具体逻辑 }; app.kue.process(queue, limit, callback);
queue
: 必选,队列名称。limit
: 可选,最大任务数。默认1
。callback
: 必选,消费函数。
job
根据 Job ID 获取指定任务信息。
const job = await app.kue.job(id);
id
: 必选,任务 ID。
jobs
获取任务列表。
const jobs = await app.kue.jobs(queue, state);
queue
: 必选,队列名称。state
: 可选,任务状态。默认为active
。
_initQueue
初始化队列客户端。
await app.kue._initQueue();
_getEventemitter
获取子进程任务事件触发器。
const emitter = app.kue._getEventemitter(queue);
queue
: 可选,队列名称。默认为全局事件。
_workTest
针对队列客户端对测试任务进行处理。
const result = await app.kue._workTest(queue, obj);
queue
: 必选,队列名称。obj
: 必选,任务信息。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/600566c181e8991b448e31d2