Golang使用redis阻塞读brpop实现即时响应并发执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang使用redis阻塞读brpop实现即时响应并发执行相关的知识,希望对你有一定的参考价值。

参考技术A 主要利用redis的brpop阻塞读和Golang的goroutine并发控制以及os/exec执行程序,实现队列有数据就立即执行对应程序并把结果set任务key。

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

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

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

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

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

注意

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

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

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

缺点:

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

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

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

不支持分组消费

以上是关于Golang使用redis阻塞读brpop实现即时响应并发执行的主要内容,如果未能解决你的问题,请参考以下文章

Redis实现优先级队列

redis 实现任务队列

怎样看redis 任务队列的任务执行数目

redis 哨兵模式 怎么查看每个redis 集群的状态

redis使用list做消息队列,为啥推送用lpush,而消费用的是brpop

Golang通道的无阻塞读写的方法示例