先吐个槽:经常看到有人对不同得消息队列做各种各样得评价以及所谓得性能测试,评估选型等等,岂不知脱离任何业务得技术评估都是瞎扯淡。(公司实际业务技术场景不提,满口胡说kafa怎么样,activemq怎么样,rabbitmq怎么样。rocketmq怎么样),试问目前有多少公司业务能够出现10w+并发吞吐量?所以我对架构得技术选型都会紧密结合相关业务具体分析。举个例子
公司只有登入短信验证码发送得业务在那边大谈,该使用百万级mq还是十万级mq,殊不知公司得客户总量有没有1w+,使用redis轻松就能搞定得业务。废话不多说切入正题:
众所周知springboot提供了redis组件得继承,我们可以轻松得使用StringRedisTemplate 对redis进行操作。
消息队列遵循先进先出得原则 即FIFO(first in first out)。那么在redis中就可以表示为 leftPush rightPop 左进右出(或者右进左出都行)。
在出队列得时候 假如程序异常了 那么是不是意味着数据就丢失了呢,所以这里还应该用一种策略,保障数据安全性,以下提供两种方案
1.可以将数据取出后序列化到本地文件。(捕获程序异常,当程序出现异常时将数据序列化至文件,待修复完成后再从本地文件反序列化回来继续执行。)
2.第二种方案,模仿确认机制,将数据取出后,再备份一份数据到备份队列。数据处理成功发起成功标志 移除备份数据,处理失败发起失败标志 将备份队列数据重新归队。
这里讲第二种方案。很显然StringRedisTemplate 已经给我们想得很全面了,它提供了一个方法,
redisTemplate.opsForList().rightPopAndLeftPush("aaa","bbb");//从aaa队列弹出一条数据,并备份至bbb队列
这边使用 rightPopAndLeftPush 即备份队列为左进,那么移除得时候就需要右出。
1.也就是说当程序逻辑处理为成功,再同步执行
redisTemplate.opsForList().rightPop("bbb");//将数据从备份队列移除
2.失败
redisTemplate.opsForList().rightPopAndLeftPush("bbb","aaa");//将数据重新入队到aaa队列
好了根据以上逻辑 相信大家可以自己写出相关代码了,具体实现代码我就不贴了。