云萌主云应用官方论坛
标题: 【转载】基于redis构建消息队列(一) [打印本页]
作者: 飘在云端 时间: 2017-1-13 14:43
标题: 【转载】基于redis构建消息队列(一)
本帖最后由 飘在云端 于 2017-1-13 14:47 编辑
一般来说,消息队列有两种场景:一种是发布者订阅者模式;一种是生产者消费者模式。利用Redis这两种场景的消息队列都能够实现。定义:
- 生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列,谁先抢到消息谁就会从队列中取走消息;即对于每个消息只能被最多一个消费者拥有。(常用于处理高并发写操作)
- 发布者订阅者模式:发布者生产消息放到队列里,多个监听队列的消费者都会收到同一份消息;即正常情况下每个消费者收到的消息应该都是一样的。(常用来作为日志收集中一份原始数据对多个应用场景)
初步探究1、redis作为消息中间件:
1)Producer/ConsumerMode:
该方式是借助redis的list结构实现的。Producer调用redis的lpush往特定key里塞入消息,Consumer调用brpop(阻塞方法)去不断监听该key。
[attach]117[/attach]
2)PubSub Mode:
redis 从 2.0.0 版本开始支持 pub/sub 指令。实现思想很简单,Publisher调用redis的publish方法往特定的channel发送消息,Subscriber在初始化的时候要subscribe到该channel,一旦有消息就会立即接收,否则会阻塞。
注:这种订阅是非持久化的。但是可以通过把订阅的消息额外的保存到redis中来实现持久化。
2、为什么采用单独的消息队列中间件?
- 由于应用会部署到多个结点,所以无法直接采用java的BlockingQueue阻塞队列(在分布式环境下),所以采用redis提供的队列支持。
- 如果要做到统计的绝对实时,最好采用大数据的实时计算的解决方案:kafka+storm 来实现
3、实现阻塞队列原理:
- redis中有一个blpop、brpop的命令,阻塞的从列表(list)中取数据,当列表为空,则阻塞知道取到数据或超时。
- blpop命令后面参数中可以跟多个list的key,内部是按照顺序进行访问的,基于这个原理可以实现高优先级队列。
欢迎光临 云萌主云应用官方论坛 (https://yunmengzhu.com/) |
Powered by Discuz! X3.4 |