专栏首页波波烤鸭RabbitMQ06-持久化和ACK确认机制

RabbitMQ06-持久化和ACK确认机制

持久化

  消息的可靠性是 RabbitMQ 的一大特色,那么 RabbitMQ 是如何保证消息可靠性的呢——消息持久化。

创建两个项目 服务消费者

服务提供者

我们在提供者处每隔两秒发送一个消息到交换器中,如下

@RunWith(SpringRunner.class)
@SpringBootTest(classes = RabbitmqDirectProviderApplication.class)
public class RabbitmqDirectProviderApplicationTests {

    @Autowired
    private Sender sender;

    @Test
    public void contextLoads() throws Exception{
        int flag = 0;
        while(true){
            Thread.sleep(2000);
            sender.send("hello .... "+flag++);
        }
    }
}

启动消费者和服务提供者

当我们在15的时候关闭消费者,然后在启动消费者我们看情况。

我们会发现在消费者下线的这段时间产生的消息并没有丢失

autoDelete 属性

@Queue: 当所有消费客户端连接断开后,是否自动删除队列 true:删除 false:不删除 @Exchange:当所有绑定队列都不在使用时,是否自动删除交换器 true:删除 false:不删除

ACK确认机制

1.什么是消息确认ACK?

  如果在处理消息的过程中,消费者的服务器在处理消息时出现异常,那么可能这条正在处理的消息刘没有完成消息消费,数据就会丢失,为了确保数据不会丢失RabbitMQ支持消息确认-ACK

2.ACK的消息确认机制

  ACK机制是消费者从RabbitMQ收到消息并处理完成后,反馈给RabbitMQ的,RabbitMQ收到反馈后才将此消息从队列中删除。

  1. 如果一个消费者在处理消息出现了网络不稳定、服务器异常等现象,会将消息重新放入队列中。
  2. 如果在集群的情况下,RabbitMQ会立即将这个消息推送给这个在线的其他消费者,这种机制保证了在消费者服务端故障的时候,不会丢失任何消息和任务。
  3. 消息永远不会从RabbitMQ中删除:只有当消费者正确发送ACK反馈,RabbitMQ确认收到后,消息才会从RabbitMQ服务器的数据中删除。
  4. 消息的ACK确认机制默认是打开的

演示ACK场景,消费的异常

消费者在一直弹出异常信息,说明消息一直被重复的添加到队列中

3.ACK机制的开发注意事项

  如果忘记ACK,那么后果会很严重,当Consumer退出时,Message会一直重新分发,然后RabbitMQ会占用越来越多的内存,由于RabbitMQ会长时间运行,因此这个“内存泄漏”是致命的。我们可以通过设置重试的次数要防止这个问题 在consumer的application.properties中添加如下配置

spring.rabbitmq.listener.direct.retry.enabled=true
# 重试次数 默认为3次
spring.rabbitmq.listener.direct.retry.max-attempts=5

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringBoot【文件上传】

      在application.properties中添加配置参数,此处要注意SpringBoot2.x版本的参数和1.x版本的参数设置有区别,需要注意

    用户4919348
  • Netty之JavaNIO编程模型介绍01

      Java NIO 全称 java non-blocking IO,是指 JDK 提供的新 API。从 JDK1.4 开始,Java 提供了一系列改进的输入/...

    用户4919348
  • Vue教程(路由Router-嵌套及案例)

    Vue 中路由在使用的时候 嵌套 使用是非常频繁的,所以本文我们就来通过案例来介绍下嵌套路由的使用。

    用户4919348
  • 深度剖析RabbitMQ可靠性消息投递以及实践方案

    一般而言,如果你选择RabbitMQ,那肯定就是把可靠性放在第一位。毕竟,RabbitMQ可是金融行业消息队列的标配。如果把性能放在第一位,那毫无疑问,必须是K...

    程序猿DD
  • 消息中间件—RabbitMQ(初探篇)

    文章摘要:本篇文章为RabbitMQ的入门文章,不像其他一些程序代码和应用实战性的文章会带着大家从一个“Hello World”的简单例子出发,在该篇幅中主要给...

    用户2991389
  • 从零开始入门 K8s | 应用编排与管理:Job & DaemonSet

    首先我们来看一下 Job 的需求来源。我们知道 K8s 里面,最小的调度单元是 Pod,我们可以直接通过 Pod 来运行任务进程。这样做将会产生以下几种问题:

    CNCF
  • 网站打包成app 博客打包成手机软件教程

    Youngxj
  • 手机盾设计相关安全问题

    本示意图为简化版本。 我们知道手机盾的两大作用是:证书管理和转账。 证书管理是指证书的下载、更新、删除。转账是指银行应用APP进行转...

    安智客
  • wordpress英文主题怎样汉化成中文网站模板

    wordpress应该很多小伙伴使用,国外一款很知名的博客系统,在国内也有很多用户使用。

    用户4831957
  • 机器学习算法KNN简介及实现

    KNN(K近邻算法)是一种不需要学习任何参数同时也非常简单的机器学习算法,既可以用来解决分类问题也可以用来解决回归问题。直观解释这个算法就是'近朱者赤,近墨者黑...

    IT派

扫码关注云+社区

领取腾讯云代金券