IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 2021-08-23 -> 正文阅读

[大数据]2021-08-23

使用RabbitMq做中间件时,生产者如何保证消息不丢失?(基于rabbitTemplate)

一. 生产者confirm机制

配置文件中新增

spring.publisher-confirm-type: correlated

这个配置是意思是:
在发送消息时,带上CorrelationData 对象,这样MQ在收到消息后就可以回调我们的服务,从而可以使用CorrelationData.get 以及 CorrelationData.get(time,TimeUnit) 两个方法监听消息妥投。
这两个方法返回是CorrelationData.Confirm,它有个isAck方法:

  1. 如果isAck为true,则表示妥投。
  2. 如果isAck为false,则表示消息未妥投,可能的原因是交换机不存在。
  3. 如果CorrelationData.get(time,TimeUnit) 超时未返回,则可能消息未妥投。当然也可能消息妥投但是回调失败,这个待会讨论。

代码如下:

CorrelationData.Confirm confirm = correlationData.getFuture().get(300L, TimeUnit.SECONDS);
            if(confirm.isAck()){
                log.info("妥投");
            }else{
                log.error("不妥投");
            }

当然,这种同步的监听方式,并不能满足所有场景,rabbitTemplate还提供了异步的监听方式

rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                if(ack){
                    log.info("妥投");
                }else{
                    log.error("不妥投");
                }

           }
        });

注意:异步监听如果消息回调失败,是监听不到的。这个待会讨论。

二.消息持久化

上面消息妥投仅仅指的是消息到达RabbitMq的交换机,但是依旧不能保持消息100%不丢失。
因为这个时间消息只是存放于内存中,如果这时rabbitMq的服务宕机,内存中的消息就可以能丢失。
这时就该用上消息持久化。
在定义交换机与队列时,可以手动设置durable来支持消息持久化

	DirectExchange exchange = ExchangeBuilder
                .directExchange(testExchange)
                .durable(true)
                .autoDelete()
                .build();
	Queue queue = QueueBuilder
                .durable(testQueue)
                .autoDelete()
                .build();

当然,消息持久化会导致吞吐量下降,因为rabbitmq需要在持久化完成才回调我们的服务完成confirm操作。

三.消息重发机制

未完待续

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-24 15:37:49  更:2021-08-24 15:38:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:24:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码