springboot + rabbitmq 如何实现消息确认机制(踩坑经验)

2020-07-01 13:01 来源:易采站长站 作者:王振洲 点击: 评论:

A-A+

原标题:springboot + rabbitmq 如何实现消息确认机制(踩坑经验)

本文收录在个人博客:www.chengxy-nds.top,技术资源共享,一起进步

最近部门号召大伙多组织一些技术分享会,说是要活跃公司的技术氛围,但早就看穿一切的我知道,这 T M 就是为了刷KPI。不过,话说回来这的确是件好事,与其开那些没味的扯皮会,多做技术交流还是很有助于个人成长的。

于是乎我主动报名参加了分享,咳咳咳~ ,真的不是为了那点KPI,就是想和大伙一起学习学习!

这次我分享的是 springboot + rabbitmq 如何实现消息确认机制,以及在实际开发中的一点踩坑经验,其实整体的内容比较简单,有时候事情就是这么神奇,越是简单的东西就越容易出错。

可以看到使用了 RabbitMQ 以后,我们的业务链路明显变长了,虽然做到了系统间的解耦,但可能造成消息丢失的场景也增加了。例如:

消息生产者 - > rabbitmq服务器(消息发送失败) rabbitmq服务器自身故障导致消息丢失 消息消费者 - > rabbitmq服务(消费消息失败)

所以说能不使用中间件就尽量不要用,如果为了用而用只会徒增烦恼。开启消息确认机制以后,尽管很大程度上保证了消息的准确送达,但由于频繁的确认交互,rabbitmq 整体效率变低,吞吐量下降严重,不是非常重要的消息真心不建议你用消息确认机制。

下边我们先来实现springboot + rabbitmq消息确认机制,再对遇到的问题做具体分析。

一、准备环境

1、引入 rabbitmq 依赖包

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2、修改 application.properties 配置

配置中需要开启 发送端消费端 的消息确认。

spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

# 发送者开启 confirm 确认机制
spring.rabbitmq.publisher-confirms=true
# 发送者开启 return 确认机制
spring.rabbitmq.publisher-returns=true
####################################################
# 设置消费端手动 ack
spring.rabbitmq.listener.simple.acknowledge-mode=manual
# 是否支持重试
spring.rabbitmq.listener.simple.retry.enabled=true

3、定义 Exchange 和 Queue

定义交换机 confirmTestExchange 和队列 confirm_test_queue ,并将队列绑定在交换机上。

@Configuration
public class QueueConfig {

 @Bean(name = "confirmTestQueue")
 public Queue confirmTestQueue() {
 return new Queue("confirm_test_queue", true, false, false);
 }

 @Bean(name = "confirmTestExchange")
 public FanoutExchange confirmTestExchange() {
 return new FanoutExchange("confirmTestExchange");
 }

 @Bean
 public Binding confirmTestFanoutExchangeAndQueue(
 @Qualifier("confirmTestExchange") FanoutExchange confirmTestExchange,
 @Qualifier("confirmTestQueue") Queue confirmTestQueue) {
 return BindingBuilder.bind(confirmTestQueue).to(confirmTestExchange);
 }
}

【易采站长站编辑:秋军】