基于异步消息队列List lpush-brpop(rpush-blpop)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于异步消息队列List lpush-brpop(rpush-blpop)相关的知识,希望对你有一定的参考价值。

参考技术A 使用rpush和lpush操作入队列,lpop和rpop操作出队列。

List支持多个生产者和消费者并发进出消息,每个消费者拿到都是不同的列表元素。

但是当队列为空时,lpop和rpop会一直空轮训,消耗资源;所以引入阻塞读blpop和brpop(b代表blocking),阻塞读在队列没有数据的时候进入休眠状态,

一旦数据到来则立刻醒过来,消息延迟几乎为零。

注意

你以为上面的方案很完美?还有个问题需要解决:空闲连接的问题。

如果线程一直阻塞在那里,Redis客户端的连接就成了闲置连接,闲置过久,服务器一般会主动断开连接,减少闲置资源占用,这个时候blpop和brpop或抛出异常,

所以在编写客户端消费者的时候要小心,如果捕获到异常,还有重试。

缺点:

做消费者确认ACK麻烦,不能保证消费者消费消息后是否成功处理的问题(宕机或处理异常等),通常需要维护一个Pending列表,保证消息处理确认。

不能做广播模式,如pub/sub,消息发布/订阅模型

不能重复消费,一旦消费就会被删除

不支持分组消费

以上是关于基于异步消息队列List lpush-brpop(rpush-blpop)的主要内容,如果未能解决你的问题,请参考以下文章

185 - 基于消息队列的异步执行程序

redis实现异步队列

185 - 基于消息队列的异步执行程序

基于Stream的Redis消息队列

Redis异步队列与延时队列

Redis 竟然能用 List 实现消息队列