当前位置: 首页 > news >正文

RabbitMq 消息确认机制详解 SpringCloud

1 消息可靠性

消息从发送,到消费者接收,会经理多个过程,其中的每一步都可能导致消息丢失.

在这里插入图片描述#### 2 常见的丢失原因

  • 发送时丢失:
    生产者发送的消息未送达exchange
    消息到达exchange后未到达queue
  • MQ宕机,queue将消息丢失
    consumer接收到消息后未消费就宕机
2.2 RabbitMQ分别给出了解决方案:
  • 生产者确认机制
  • mq持久化
  • 消费者确认机制
  • 失败重试机制

3 生产者消息确认

RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。这种机制必须给每个消息指定一个唯一ID。消息发送到MQ以后,会返回一个结果给发送者,表示消息是否处理成功。

  • publisher-confirm-type 消息确认类型,
    • simple:同步等待confirm结果,直到超时
    • correlated:异步回调,定义ConfirmCallback,MQ返回结果时会回调这个ConfirmCallback
  • publisher-returns 交换机发送到队列中,失败时触发
  • template.mandatory:定义消息路由失败时的策略。true,则调用ReturnCallback;false:则直接丢弃消息
spring:rabbitmq:publisher-confirm-type: correlatedpublisher-returns: truetemplate:mandatory: true

然后配置 RabbitTemplate

@Slf4j
@Configuration
public class RabbitCommonConfig {@Beanpublic RabbitTemplate fastjsonRabbitTemplate(ConnectionFactory connectionFactory){RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);//设置强制回调rabbitTemplate.setMandatory(true);//rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {@Overridepublic void confirm(CorrelationData correlationData, boolean b, String s) {log.info("对应数据 {}",correlationData);log.info("确认情况 {}",b);log.info("原因 {}",s);}});//发送失败时的回调rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {@Overridepublic void returnedMessage(ReturnedMessage returnedMessage) {log.info("确认情况 {}",returnedMessage.toString());//日志记录 重试}});return rabbitTemplate;}}

完毕

http://www.lryc.cn/news/39035.html

相关文章:

  • 后台导航布局
  • 设计模式——抽象工厂模式(创建型)
  • Java面试题--SpringMVC的执行流程
  • c# 32位程序突破2G内存限制
  • 【C语言】指针详解总结
  • Java加解密(八)工具篇
  • Go框架三件套(Web/RPC/ORM)
  • HR问:假如公司给不到你期望的薪资怎么办?这个问题该如何体面地回答?
  • LearnOpenGL-高级OpenGL-2.模板测试
  • 【Git从入门到精通】Git入门
  • 软件测试18
  • C语言实现快速排序(hoare法、挖坑法、前后指针法与非递归实现)——不看后悔系列
  • 如何为系统可靠性的量化提供依据
  • 量化投资中的因子是什么?因子是如何分类的,包括哪些?
  • 力扣-修复表中的名字
  • 【博客633】linux vxlan设备工作原理
  • 3.12学习周报
  • 电力电子中逐波限流控制以及dsp实现
  • 【数据结构】 顺序表
  • Elasticsearch 集群规划- 单台机器核心数计算公式
  • Tesla都使用什么编程语言?
  • 1143. 最长公共子序列——【Leetcode每日刷题】
  • 【并发基础】线程的通知与等待:obj.wait()、obj.notify()、obj.notifyAll()详解
  • css黏性定位-实现商城的分类滚动的标题吸附
  • @Component和@bean注解在容器中创建实例区别
  • 不写注释就是垃圾
  • 深信服一面
  • 【C语言】深度理解指针(中)
  • 步进电机运动八大算法
  • 如果你持续大量的教坏ChatGPT,它确实会变坏