基于redis stream消息队列的最新解决方案之spring-boot简单尝试



可以实现消息队列的工具有很多,例如:

ZeroMQ、Posix、SquirrelMQ、Redis、QDBM、Tokyo Tyrant、HTTPSQS等(linux平台下)

各自具备各自的特性,不在展开讨论。

其中redis 的订阅的发布,在spring boot是如何实现的,我们来看看代码:

依赖:

      1. 

<parent><groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.11.RELEASE</version> <relativePath/> <!-- lookup parent from repository --></parent>

       2. 

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency></dependencies>

 配置:


spring: application: name: example profiles: test redis: host: localhost port: 6379 password: database: 0 lettuce: pool: 10 min-idle: 10 max-active: 20 max-wait: 10000


注册监听器:

监听消息:


发送信息:

    redisTemplate.convertAndSend(channel,message)

这样下来,感觉似乎很完美,但是,无法保证消息真的/一定被消费了,例如客户端关机,宕机,或重启,都会导致数据丢失。因为,这些信息一旦发出,就没有历史记录。专业点就是,不可持久化 和没有ack确认机制。

那么 redis 5.x版本 的stream数据结构很好的解决了这个问题,不但可以发布订阅,还可以能持久化,最重要的是 有ack机制,极大程度上保证了数据的一致性。

好了,尝试搞起来!

进入官网:spring.io


选择spring data

打开 spring data redis 的文档


最新版本 2020-7-20发布的 2.3.2版本。其对应的srping cloud Hoxton SR6,spring boot 2.3.2.RELEASE

依赖和配置和之前一样,

注意的是:

意思就是说,暂时只支持 lettuce 连接池,

下面看看如何实现。

先实现监听器接口:StreamListener


只有一个方法,onMessage(V var)  ===>你可以 lombok实现也行。

我们下面做个测试接收下消息。


然后 注册 监听器:



  发送消息:

上面的意思是有两种方式,一个是传入字节数组,另一个则是 Map, 也可以说是任何对象。

翻开 StringRecord 源码:


看官方提供的第二个构造 接受的是 string -> json   

再看 StreamRecords.string(data),其参数为 Map<String,String>

最后测试下:

简单的从web端push一条消息。


看看打印结果:


1. 这个明显可能是 redis版本问题,更新redis 版本 5x以上

2. 可能是 StreamRecords.string(data)参数问题,换成:Collections.singletonMap( k,v) 的SingletonMap 问题就解决了:


究竟是什么原因呢?

细看  

Record ,StreamRecords  自行研究这两个的源码吧····

另外 :


那好,我们来尝试,最后一个策略,并且在消费完消息后 加上ack确认机制:


结果:

分组 group 可以在客户端创建 ,也可以程序启动时初始化:


key 就是 上面的stream , group 自定义取名字:我这里 是mygroup

至于ReadOffset 参数,自行研究源码即可,不难!读取数据的策略而已。

最后别忘记了在注册监听器加上 group;


这个 name 就是当前消费者的名字,随便写。比如写当前当前ip    192.168.0.110

 redis stream 的消息队列最新解决方案 演示到此结束了,其中会有点坑需要自己爬,祝你好运!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342