RabbitMQ(六)消息应答和持久化

news2024/12/22 19:18:04

目录

    • 一、RabbitMQ 消息应答
    • 二、RabbitMQ 持久化
      • 1.交换机的持久化
      • 2.队列的持久化
      • 3.消息的持久化
      • 4.持久化问题

在这里插入图片描述

官网地址:https://www.rabbitmq.com/

下载地址:https://www.rabbitmq.com/download.html

一、RabbitMQ 消息应答

​ 执行一个任务可能需要花费几秒钟的时间,你可能会担心如果一个消费者在执行任务过程中挂掉了。基于现在的代码,一旦RabbitMQ将消息分给了消费者,就会从内存中删除。在这种情况下,如果杀死正在执行任务的消费者,会丢失正在处理的消息,也会丢失已经分发给这个消费者上未处理的消息。

​ 但是,我们不想丢失任何任务,如果有一个消费者挂掉了,那么我们应该将分发给它的任务交付给另一个消费者去处理。为了确保消息不会丢失,RabbitMQ支持消息应答。消费者发送一个消息应答,告诉 RabbitMQ 这个消息已经接受并且处理完毕了。RabbitMQ可以删除它了。

​ 如果一个消费者挂掉却没有发送应答,RabbitMQ会理解为这个消息没有处理完毕,然后交给另一个消费者去重新处理。这样,你就可以确认即使消费者偶尔挂掉也不会丢失任何消息了。

​ 没有任何消息超时限制;只有当消费者挂掉时,RabbitMQ 才会重新投递。即使处理一条消息会花费很长的时间。消息应答是默认打开的。我们明确地把它们关掉了(autoAck=false)。现在将应答打开,一旦我们完成任务,消费者会自动发送消息应答。

boolean authAck = false;
channel.basicConsume(QUEUE_NAME, autoAck, consumer);

二、RabbitMQ 持久化

  • 持久化:是为了提高 RabbitMQ 消息的可靠性,放置在异常情况(重启,关闭,宕机)下数据的丢失

  • RabbitMQ 持久化分为三个部分:交换机的持久化队列的持久化消息的持久化

1.交换机的持久化

​ 交换机的持久化是通过声明队列时,将 durable 参数设置为 true 实现的。如果交换器不设置持久化,那么 RabbitMQ 服务重启之后,相关的交换器元数据会丢失,不过消息不会丢失,只是不能将消息发送到这个交换器中了,建议将交换器设置为持久化。

设置交换器的持久化:

// 三个参数分别为 交换器名、交换器类型、是否持久化
channel.exchangeDeclare(EXCHANGE_NAME, "topic", true);

2.队列的持久化

​ 队列的持久化是通过声明队列时,将 durable 参数设置为 true 实现的。如果队列不设置持久化,那么 RabbitMQ 服务重启之后,相关的队列元数据将会丢死,而消息似乎存车处在队列中的,所以队列中的消息也会被丢失。

设置队列的持久化:

// 参数1 queue:队列名
// 参数2 durable:是否持久化
// 参数3 exclusive:仅创建者可以使用的私有队列,断开后自动删除
// 参数4 autoDelete:当所有消费客户端断开连接后,是否自动删除队列
// 参数5 arguments
channel.queueDecalre(QUEUE_NAME, true, false, false, null);

3.消息的持久化

​ 队列的持久化只能保证其队列本身的元数据不会被丢失,但是不能保证消息不会被丢失。所以消息本身也需要被持久化,可以在投递消息前设置 AMQ.BasicProperties 的属性 deliveryMode 的值为 2 即可。

// 参数1 exchange:交换器
// 参数2 routingKey:路由键
// 参数3 props:消息的其他参数,其中 MessageProperties.PERSISTENT_TEXT
// 参数4 body:消息体
channel.basicPublish("", queue_name, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());

4.持久化问题

描述:将交换机、队列和消息都设置持久化之后既能保证数据不会被丢失吗?当然不能,多个方面:

  • 问题1: 消费者端,消费者订阅队列将autoAck设置为 true,虽然消费者接收到了消息,但是没有来得及处理就宕机了,那数据也会丢失。

    解决方案: 以手动确认接收消息,待处理完消息之后,手动删除消息。

  • 问题2: 在 RabbitMQ 服务器,如果消息正确被发送,但是 RabbitMQ 未来得及持久化,没有将数据写入磁盘,服务异常而导致数据丢失。

    解决方案: 可以通过 RabbitMQ 集群的方式实现消息中间件的高可用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

petitlyrics 歌词提取 有感

想做一下歌曲的时间轴,搜歌词搜到了这个网站。奇怪的是看前端代码和network监听请求都不能获得完整歌词。如 https://petitlyrics.com/lyrics/934773a. 歌词截图如下:b. 控制台查看前端代码只有部分歌词c. Network查看请求数据,发现是日语对应…

小白和设计师都能用的 3D 渲染神器 #Rotato

“我非常喜欢它。它为我节省了很多时间,而不必在 Adobe After Effects 等应用程序中挣扎。”——Dominik Sobe on Product HuntRotato 是什么?Rotato 是一款功能强大的 3D 样机渲染神器,支持 PNG 、JPG 、 avi、mov 、mp4 等多种格式。不仅能…

10分钟在 Rainbond 上部署 mall 电商项目

很多小伙伴在学习 mall 电商项目时,都会在部署上折腾许久,虽然目前已经提供了很多种部署方式,比如 在 Linux 上部署 mall 、使用 Docker 或 DockerCompose 部署 mall ,但对于正在学习的我们都显得比较复杂,需要理解并学…

Vue.js组件编程的知识要点

在C/S编程中,对程序员来说,组件编程是一个不能忽视或者越过的技术能力,特别是自定义的组件编程以及构建基础组件库。虽然组件编程不是必须的,全部使用系统或者别人的组件(控件)也可以完成系统的开发&#x…

使用Python根据原始Excel表格批量生成目标Excel表格

点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤亭台六七座,八九十枝花。大家好,我是Python进阶者。一、前言前几天在帮助粉丝解决问题的时候,遇到一个简单的小需求&#…

程序员如何通过兼职赚钱?有哪些渠道?

程序员的工资是没有网上说的那么夸张。 就我自己来说,在刚刚工作的那几年,月薪没有超过1万块钱。但是刚刚来到大城市,这点工资连我交房租都不够,生存都成了问题。于是我开始考虑进行兼职,虽然在最开始的几个月也只能有…

(Week 11)综合复习(C++,图论,动态规划,搜索)

目录汤姆斯的天堂梦(C,Dijkstra)题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示解题思路:[蓝桥杯 2022 国 A] 环境治理(C,Floyd)题目描述输入格式输出格式样例 #1样例输入 #1样例输…

工控安全—工控常见协议识别

文章目录一、Nmap常见参数介绍二、工控常见协议识别三、工控设备指纹识别3.1 S73.2 Modbus3.3 IEC 60870-5-1043.4 DNP33.5 EtherNet/IP3.6 BACnet3.7 Tridium Niagara Fox3.8 Crimson V33.9 OMRON FINS3.10 PCWorx3.11 ProConOs3.12 MELSEC-Q四、测试一、Nmap常见参数介绍 -s…

STM32F411CE驱动Xbox摇杆

外观 引脚说明和原理 GND-GND 5V-5V VRX-ADC1通道1 VRX-ADC1通道2 SW独立按键-单片机的输入检测 本质上这个遥感就是集成了一个按键和两个电位器,遥感转动改变电位器也会转动,电压输出的值也就不一样,通过检测数值可自定义的做出判断&a…

linux发送tcp/udp请求

本文章介绍下通过nc工具和iperf工具,发送tcp/udp请求一、nc工具(netcat工具)这个工具linux系统默认是自带的,以下是命令的常用参数1.1 发送tcp请求在服务端监听端口nc -l port客户端连接并发送请求nc -v host port在服务端收到了信…

javaWeb 会话和跟踪

会话 用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。 会话跟踪 HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视…

kafka消费者API

kafka的消费方式 pull(拉模式) 消费者采用从broker中主动拉去数据 kafka采用这种方式 push(推模式) kafka没有采用这种方式,因为由broker决定消费发送速率。很难适应所有消费者 pull模式不足之处是,如…

Linux 的 Vim,gcc,makefile 的使用

坚持看完,结尾有思维导图总结 这里写目录标题vimvim的安装vim的配置vim 的使用vim 的三种模式三种模式对应的命令通用命令模式底行模式gcc 和 g编译和执行预编译编译汇编链接过程make总结vim Vim 是Linux 中使用的编辑器,一般的程序要经历一个过程才能运…

Codeforces Round #841 (Div. 2) and Divide by Zero 2022(A~E)

A. Joey Takes Money给出一个序列a,每次操作可以选择两个数,将两个数分别改成与原数乘积相同的两个数,问最后得到的最大的数组和是多少。思路:乘积一定,和最大一定是与1相乘。则整个数组的积与n - 1个1的和就是最大值。…

探索云原生技术之容器编排引擎-Kubernetes/K8S详解(7)

❤️作者简介:2022新星计划第三季云原生与云计算赛道Top5🏅、华为云享专家🏅、云原生领域潜力新星🏅 💛博客首页:C站个人主页🌞 💗作者目的:如有错误请指正,将…

缓存(redis)与数据库(MYSQL)数据一致性问题

在MYSQL数据库集文章中,仔细的学习了一些MYSQL数据库的知识。但是,随着我们的业务越来越好,那么我们不可能直接去操作MYSQL数据库。因为直接去操作MYSQL终究会有比较多的I/O操作,而使整个系统的性能最终受到数据库I/O的制约而无法…

教外篇(6):C++ qrencode 实现二维码生成

系列文章目录 文章目录 系列文章目录前言一、qrencode库的基本使用二、BMP图片生成原理三、二维码生成四、放大图像、解决编码问题前言 该系列教程目录与说明可以查看这篇文章::C/C++教程 本文主要介绍如何使用C++来实现二维码的生成,使用到了开源库:qrencode 代码生成结…

C++入门--vector

目录 vector的介绍 vector的使用 对象的定义 遍历 reserve与resize insert与erase 迭代器失效 vector的模拟实现 vector的介绍&#xff1a; vector是表示可变大小数组的序列容器。 vector的使用&#xff1a; 对象的定义&#xff1a; void test_vector1() {vector<int…

ZYNQ图像-腐蚀膨胀笔记

大磊fpga 腐蚀 下图从左到右依次为a&#xff0c;b&#xff0c;c step1&#xff1a;将b中的黄色十字架在a中遍历 step2&#xff1a;当b的黄色方格在a中 没有碰到白色方格 时输出中心坐标 step3&#xff1a;将step2中所有输出的坐标涂成黄色&#xff0c;得出c图 膨胀 step1…

Redhat 7 安装 iftop软件

1.关闭subscription-manager vi /etc/yum/pluginconf.d/subscription-manager.conf enable 0 2.通过浏览器下载Centis-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo 3.上传至/etc/yum.repos.d/ 4.修改Centos-7.repo文件 #cd /etc/yum.repos.d/ #ls #vim CentOS…