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实现即时响应并发执行的主要内容,如果未能解决你的问题,请参考以下文章