返回顶部

【转载】基于redis构建消息队列(一)

[复制链接]
飘在云端Lv.9 显示全部楼层 发表于 2017-1-13 14:43:49 |阅读模式 打印 上一主题 下一主题

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 飘在云端 于 2017-1-13 14:47 编辑

一般来说,消息队列有两种场景:一种是发布者订阅者模式;一种是生产者消费者模式。利用Redis这两种场景的消息队列都能够实现。定义:

  • 生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列,谁先抢到消息谁就会从队列中取走消息;即对于每个消息只能被最多一个消费者拥有。(常用于处理高并发写操作)
  • 发布者订阅者模式:发布者生产消息放到队列里,多个监听队列的消费者都会收到同一份消息;即正常情况下每个消费者收到的消息应该都是一样的。(常用来作为日志收集中一份原始数据对多个应用场景)
初步探究

1、redis作为消息中间件:
1)Producer/ConsumerMode:
该方式是借助redis的list结构实现的。Producer调用redis的lpush往特定key里塞入消息,Consumer调用brpop(阻塞方法)去不断监听该key。

QQ图片20170113145043.png

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,内部是按照顺序进行访问的,基于这个原理可以实现高优先级队列。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

云萌主 云萌主-BIGSAAS旗下,由北京合智互联信息技术有限公司在2018年创立,为广大云应用技术爱好者的平台。在云萌主论坛可以查看云应用技术文章、云产品产品最新资讯、技术问答、技术视频。在畅游云上技术的同时,学到最新的云应用产品和技术。
  • 微信公众号

  • Powered by Discuz! X3.5 | Licensed | Copyright © 2001-2022, Aliyun Cloud. | 星点互联设计
  • 京ICP备18052714号 | 营业执照 | |合智互联| QQ