本文收录在个人博客: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 配置来1源gaodai#ma#com搞*代#码1网
配置中需要开启 发送端
和 消费端
的消息确认。
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); } }