网站开发定制模板网站建设,安卓开发公司,wordpress 坏图片,北京网站建设++知乎背景
已知rabbitmq和kafka作为消息中间件来给程序之间增加异步消息传递功能#xff0c;这两个中间件都是专业的#xff0c;功能也很强#xff0c;但是有的时候过于复杂#xff0c;对于只有一组消费者的消息队列#xff0c;使用Redis 就可以轻松搞定。
异步消息队列
读者…背景
已知rabbitmq和kafka作为消息中间件来给程序之间增加异步消息传递功能这两个中间件都是专业的功能也很强但是有的时候过于复杂对于只有一组消费者的消息队列使用Redis 就可以轻松搞定。
异步消息队列
读者可以思考一下他的几种数据结构哪种更适合stringhashsetzsetlist
是的很明显list使用rpush/lpush进队列rpop/lpop出队列
队列空了怎么办
消费者重复快速从队列中消费那么队列很快就会空那么就会重复pop操作。浪费生命的空轮询拉高无用的能耗通常的解决方案就是让消费线程睡一会一般1s就够了。
但是又有新问题如果消费者数量过多睡眠时间综合起来就太多了缩短睡眠时间但还是有别的方案阻塞读 blpop brpop b前缀是blocking 阻塞 阻塞读是队列为空时会立刻进入休眠状态一旦数据来了就立即唤醒基本没有延迟。
看起来是不是完美无缺但是如果断开链接呢
线程一直阻塞的话Redis链接闲置的话服务器会关闭它并抛出异常。
延时队列的实现
redis中一种特殊的数据结构zset消息序列化成一个字符串作为zset的value消息的到期时间作为他们的score用多个线程轮询zset获取到期的任务处理。多个线程保证可用一个线程挂了还有其他的