首页 > 其他分享 >RabbitMQ消息持久化

RabbitMQ消息持久化

时间:2023-06-28 17:25:23浏览次数:38  
标签:SpringAMQP 队列 RabbitMQ 交换机 消息 持久

我们看下之前启动idea测试消息发送的时候在后台生成的一条消息,现在已经在消息队列里面还没有被消费。

 现在我们重启下RabbitMQ,执行linux命令:docker restart mq

看上图实时显示的错误信息,失去连接了,接下来刷新这个页面,可以发现这个对象没有了。

 说明rabbit消息并不会持久化,不仅如此,我们查看下交换机,发现连之前建的交换机都没有了:

 那为什么系统交换机还在呢,说明系统交换机持久化了,这就要跟交换机持久化类型有关了,Durability这个属性如果是Durable的就代表是持久化的,如果是Transient的类型的就代表是暂时的。而系统的这些都是带D的,说明它们是持久化的组件。

上面的设置是在网页端设置,如果要在java代码里面怎么设置呢?

生产者确认可以确保消息投递到RabbitMQ的队列中,但是消息发送到RabbitMQ以后,如果突然宕机,也可能导致消息丢失。

要想确保消息在RabbitMQ中安全保存,必须开启消息持久化机制。

- 交换机持久化
- 队列持久化
- 消息持久化

RabbitMQ中交换机默认是非持久化的,mq重启后就丢失。

SpringAMQP中可以通过代码指定交换机持久化:

  @Bean
  public DirectExchange simpleExchange(){
    // 三个参数:交换机名称、是否持久化、当没有queue与其绑定时是否自动删除
    return new DirectExchange("simple.direct", true, false);
  }

事实上,默认情况下,由SpringAMQP声明的交换机都是持久化的。

上面的是交换机持久化,队列持久化呢?

RabbitMQ中队列默认是非持久化的,mq重启后就丢失。

SpringAMQP中可以通过代码指定交换机持久化:

  @Bean
  public Queue simpleQueue(){
    // 使用QueueBuilder构建队列,durable就是持久化的
    return QueueBuilder.durable("simple.queue").build();
  }

事实上,默认情况下,由SpringAMQP声明的队列都是持久化的。

可以在RabbitMQ控制台看到持久化的队列都会带上`D`的标示:

利用SpringAMQP发送消息时,可以设置消息的属性(MessageProperties),指定delivery-mode:

 

- 1:非持久化
- 2:持久化

用java代码指定:

 默认情况下,SpringAMQP发出的任何消息都是持久化的,不用特意指定。

为什么默认持久化了还要特意说下呢,因为持久化其实会损失性能,因此有些场合是可以不做消息持久化的,这都是根据业务来的。

 

标签:SpringAMQP,队列,RabbitMQ,交换机,消息,持久
From: https://www.cnblogs.com/wekenyblog/p/17511960.html

相关文章

  • Tomcat7 session 持久化
    tomcat7session默认是持久化的,tomcat7关闭或者重启,都会将内容持久化到SESSION.ser文件,这里推荐使用everything这个软件,查找这个文件。参考官方文档: 戳我......
  • Android性能优化:微信自用高性能持久化框架——MMKV组件原理
    MMKVMMKV——基于mmap的高性能通用key-value组件,底层序列化/反序列化使用protobuf实现,性能高,稳定性强。githubMMKV是基于mmap内存映射的移动端通用key-value组件,底层序列化/反序列化使用protobuf实现,性能高,稳定性强。从2015年中至今,在iOS微信上使用已有近3年,其......
  • Python操作RabbitMq
    Python操作RabbitMq:pika--队列)安装使用其他读取方法安装pipinstallpika使用importpika#建立连接#user:账号 pwd:密码userx=pika.PlainCredentials(user,pwd)#hosh:rabbitmq所在的ip port:端口号parameters=pika.ConnectionParameters(host,int(port)......
  • 谷粒商城项目篇12_分布式高级篇_购物车功能、消息队列RabbitMQ
    目录购物车模块vo的编写编写interceptor绑定user-key线程共享数据购物车商品的增加添加完成重定向避免刷新页面重复提交购物车商品的增删改查消息队列RabbitMQ场景理解概述docker安装RabbitMQ整合SpringBoot消息确认机制一、购物车模块需求描述在线购物车:登录状态添......
  • 如何解决MQTT消息积压
    什么是消息积压?大量消息被堆积在broker端,没有被消费。为什么会消息积压?宏观角度主要原因是:producer端生产速度>consumer端消费速度。导致producer端生产速度>consumer端消费速度的情况有多种:设计的时候就没有考虑消费速度要大于生产速度,这种情况最不应该。某一时刻......
  • 基于Redis的消息发布和订阅(广播模式)
    最近在优化一个redis的大key问题,原先的同事写法是将所有的配置都放在一个key里面,value是一个map.但是随着配置越来越多,这个map也变得很大,已经影响redis的性能.遂决定将map里面的每个配置单独出来一个key,当有配置变动的时候,通过redis的消息队列通知到其他程序.下面......
  • Python全栈工程师(23:消息队列RabbitMQ)
    谁能用通俗的语言解释一下什么是RPC框架?深入浅出RPC-浅出篇深入浅出RPC-深入篇1小时写一个分布式系统基础框架(一个java实现帮助理解RPC)RabbitMQ消息队列安装 http://www.rabbitmq.com/install-standalone-mac.html安装pythonrabbitMQmodulepipinstallpikaoreasy_......
  • SAP ABAP 动态结构实现发送企业微信应用消息
    企业微信官方接口:应用支持推送文本、图片、视频、文件、图文等类型。请求方式:POST(HTTPS)请求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN 大概思路:1.封装调用企业微信函数SE37:ZWECHAT_SEND_MESSAGE_MSGTYPE 注:   a.  ......
  • centos 7 安装RabbitMQ
    RabbitMQ是一个开源的遵循AMQP协议实现的基于 Erlang语言编写,即需要先安装部署Erlang环境再安装RabbitMQ环境。Linux系统:CentOS7.x(如果是CentOS8.x的话,需要修改下面两个环境版本号中的el7为el8)Erlang:erlang-22.3.4.12-1.el7.x86_64.rpmRabbitMQ:rabbitmq-server-3.8.13-1.e......
  • Rabbitmq:消息队列介绍、Rabbitmq安装、 基于Queue实现生产者消费者模型、基本使用(生产
    目录一、消息队列介绍1.1介绍1.2MQ解决什么问题1.3常见消息队列及比较二Rabbitmq安装2.1服务端原生安装2.2服务端Docker安装2.3客户端安装2.4设置用户和密码三基于Queue实现生产者消费者模型四基本使用(生产者消费者模型)五消息安全之ack六消息安全之durable持久化七闲置消......