win10搭建rabbitmq-玩转springboot集成rabbitmq

至于下载安装有好多文章描述了,今天借鉴一下别人的安装,来做一个记录。因为安装这个以后,下一章节我要开启springboot-rabbitmq的项目,接下来,就是调整消费的性能。给大家一套完整的逻辑写法以及使用

下载安装请参考这篇文章:https://blog.csdn.net/funtaster/article/details/83748833

 

通过上面的安装启动,你最终看到的画面是这样的:

 

 

 这个基础功能完成以后,接下来我们就去下载一个 springboot集成rabbitmq基础模板,

https://gitee.com/shenzhanwang/Spring-rabbitMQ

 

通过上面的安装,项目搭建-接下来才是属于我们的天下

1.玩法一。

rabbimq 再项目中能做什么。

基于我们真实的项目而言。我们你用rabbitmq机制,完成了,电商的售后功能。  电商售后的大概逻辑: 前端通过接受退款订单请求,销售人-确认退货-退款。发起售后订单----在发起退款-退货

 

完成这么一个流程,里面需要注意的点:

1.权限问题

2.通知问题

 

权限问题: 由谁管控售后退款的最终确认,因为是流程,那么必须由以下几个,销售人员-高级销售-主管-财务。等人员参与其中,来完成这个流程

通知问题:没走一步,我们都需要通知相应的人员做出来。用消费机制的思想取实现。没走一步,消费者都能接受到相应权限的订单

在业务逻辑的异步处理,系统解耦,分布式通信以及控制高并发的场景下,消息队列有着广泛的应用

 

具体了解rabbitmq的模式可以通过上面的gitee里面的介绍完成。

 

通过上面的配置我们可以:看到结果

 

 

 

 

 

 由此我们接收到基本的通信。

但是真实项目中的,往往比这个更复杂:往往需要手动确认ack

rabbitmq默认是自动ack,消费端只要消费,mq服务就会删除这条消息。

我们想象以下场景:

假如我们消费服务出现异常,这条消息被mq服务删除,当我们修复了消费服务,但是无法主动重新消费这条消息,这种业务逻辑显然是不可行的。

正常业务逻辑应该是本地业务执行成功,手动ack这条消息。那有的小伙伴就说了,业务执行完毕,手动ack的时候恰好服务宕机了,重启这不是会造成重复消费吗?没错,这就牵扯mq的另一个问题了,mq消息重复消费,后续文章会写如何解决这个问题。本文主要讲解mq的手动ack

 mq消费端手动ack,是保证可靠性消费的核心保障。

application.properties配置

server.port=8080

spring.rabbitmq.host=dev-mq.ttsingops.com
spring.rabbitmq.port=5672
spring.rabbitmq.username=cddayuwen
spring.rabbitmq.password=cddayuwen@123
spring.rabbitmq.virtual-host=/cd
#发布者确认
spring.rabbitmq.publisher-confirm-type=correlated
#发布者到达确认
spring.rabbitmq.publisher-returns=true

spring.rabbitmq.listener.type=simple

#simple关闭自动ack,手动ack
spring.rabbitmq.listener.simple.acknowledge-mode=manual
### 开启重试机制
spring.rabbitmq.listener.simple.retry.enabled=true
#最大重试传递次数
spring.rabbitmq.listener.simple.retry.max-attempts=3
#第一次和第二次尝试传递消息的间隔时间 单位毫秒
spring.rabbitmq.listener.simple.retry.initial-interval=5000ms
#最大重试时间间隔,单位毫秒
spring.rabbitmq.listener.simple.retry.max-interval=300000ms
#应用前一次重试间隔的乘法器,multiplier默认为1
spring.rabbitmq.listener.simple.retry.multiplier=3
#以上配置的间隔0s  5s  15s  45s


#重试次数超过上面的设置之后是否丢弃(消费者listener抛出异常,是否重回队列,默认true:重回队列, false为不重回队列(结合死信交换机))
spring.rabbitmq.listener.simple.default-requeue-rejected=true

### 模板配置
##设置为 true 后 消费者在消息没有被路由到合适队列情况下会被return监听,而不会自动删除
spring.rabbitmq.template.mandatory=true

这样配置以后,即使被消费,也不会被从rabbitmq删除。

 

 

 

二。

如何实现延迟队列。
rabbitmq添加TTL,

延时队列就是用来存放需要在指定时间被处理的元素的队列

那么什么时候需要用延时队列呢?考虑一下以下场景:

1.订单在十分钟之内未支付则自动取消。
2.新创建的店铺,如果在十天内都没有上传过商品,则自动发送消息提醒。
3.账单在一周内未支付,则自动结算。
4.用户注册成功后,如果三天内没有登陆则进行短信提醒。
5.用户发起退款,如果三天内没有得到处理则通知相关运营人员。
6.预定会议后,需要在预定的时间点前十分钟通知各个与会人员参加会议。

 

 

这些场景都有一个特点,需要在某个事件发生之后或者之前的指定时间点完成某一项任务

 

 

如果不能实现在消息粒度上添加TTL,并使其在设置的TTL时间及时死亡,就无法设计成一个通用的延时队列。

安装一个插件即可:https://www.rabbitmq.com/community-plugins.html ,下载rabbitmq_delayed_message_exchange插件,然后解压放置到RabbitMQ的插件目录。

接下来,进入RabbitMQ的安装目录下的sbin目录,执行下面命令让该插件生效,然后重启RabbitMQ。

rabbitmq-plugins enable rabbitmq_delayed_message_exchange
 
 

 

posted @ 2020-12-04 14:21  技术专家  阅读(235)  评论(0)    收藏  举报