用Redis实现的支持事务的消息队列。
在用Redis的list做队列的时候,存在消息丢失的问题,该项目主要解决消息的稳定性。
npm install --save node-redis-q
var RedisQ=require("node-redis-q");
var queue=new RedisQ(conn, name,isDelay);
conn
:ioredis的连接字符串或都连接对象,例redis://127.0.0.1/0
name
:第二个参数为队列名称isDelay
:是否是延迟队列,延迟队列的消息会开启一个延迟消息扫描线程,默认开启。
await queue.push(msg,[name],[delay]);
msg
:消息内容,可以是Javascript对象name
:入队的队列名称,若为空则取实例的队列名称。delay
:消息延迟多长时间才执行,单位:秒。
await queue.pull();
返回值为一个Javascript对象
{
id:"", //消息id
content:"", //消息内容,可以是Object类型
times:0 //消息被读取的次数
}
await queue.ack(id,[success]);
id
:消息idsuccess
:消息是否消费成功,默认:true
。
使用redis的multi开启对事务的支持,开启后,可以同队列操作一起执行redis的命令。
开启事务后,push和ack方法也需要手动提交。
queue.multi()
queue.send(command,id);
command
:一条redis命令,以数组方式传入各参数,如:["set","test","aaa"]
id
:命令id,有id的命令会有返回值。
await queue.exec();
返回值为一个数组,包含了对应的自定义命令的返回结果。
queue.discard();
queue.setLog(level);
level
:日志级别,详见log4js
queue.delay(id,seconds);
id
:需要延迟的消息id。seconds
:延迟时长,单位:秒。
被延迟的消息不需要再调用ack进行消费确认。
redis
:当前队列使用的ioredis实例。