我的编程空间,编程开发者的网络收藏夹
学习永远不晚

RabbitMQ消息丢失怎么防止

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

RabbitMQ消息丢失怎么防止

这篇文章主要介绍“RabbitMQ消息丢失怎么防止”,在日常操作中,相信很多人在RabbitMQ消息丢失怎么防止问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”RabbitMQ消息丢失怎么防止”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    一.RabbitMQ消息丢失的三种情况

    RabbitMQ消息丢失怎么防止

    第一种:

    生产者弄丢了数据。生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题啥的,都有可能。

    第二种:

    RabbitMQ 弄丢了数据。MQ还没有持久化自己挂了

    第三种:

    消费端弄丢了数据。刚消费到,还没处理,结果进程挂了,比如重启了。

    二.RabbitMQ消息丢失解决方案

    RabbitMQ消息丢失怎么防止

    1.针对生产者

    方案1 :开启RabbitMQ事务

    可以选择用 RabbitMQ 提供的事务功能,就是生产者发送数据之前开启 RabbitMQ 事务channel.txSelect,然后发送消息,如果消息没有成功被 RabbitMQ 接收到,那么生产者会收到异常报错,此时就可以回滚事务channel.txRollback,然后重试发送消息;如果收到了消息,那么可以提交事务channel.txCommit。

    // 开启事务channel.txSelecttry {      // 这里发送消息} catch (Exception e) {      channel.txRollback// 这里再次重发这条消息}// 提交事务channel.txCommit

    缺点:
    RabbitMQ 事务机制是同步的,你提交一个事务之后会阻塞在那儿,采用这种方式基本上吞吐量会下来,因为太耗性能。

    方案2: 使用confirm机制 

    事务机制和 confirm 机制最大的不同在于,事务机制是同步的,你提交一个事务之后会阻塞在那儿,但是 confirm 机制是异步的

    在生产者开启了confirm模式之后,每次写的消息都会分配一个唯一的id,然后如果写入了rabbitmq之中,rabbitmq会给你回传一个ack消息,告诉你这个消息发送OK了;如果rabbitmq没能处理这个消息,会回调你一个nack接口,告诉你这个消息失败了,你可以进行重试。而且你可以结合这个机制知道自己在内存里维护每个消息的id,如果超过一定时间还没接收到这个消息的回调,那么你可以进行重发。

    //开启confirmchannel.confirm();//发送成功回调public void ack(String messageId){      }// 发送失败回调public void nack(String messageId){//重发该消息}

    2.针对RabbitMQ

    说三点:

    (1)要保证rabbitMQ不丢失消息,那么就需要开启rabbitMQ的持久化机制,即把消息持久化到硬盘上,这样即使rabbitMQ挂掉在重启后仍然可以从硬盘读取消息;

    (2)如果rabbitMQ单点故障怎么办,这种情况倒不会造成消息丢失,这里就要提到rabbitMQ的3种安装模式,单机模式、普通集群模式、镜像集群模式,这里要保证rabbitMQ的高可用就要配合HAPROXY做镜像集群模式

    (3)如果硬盘坏掉怎么保证消息不丢失

    (1)消息持久化

    RabbitMQ 的消息默认存放在内存上面,如果不特别声明设置,消息不会持久化保存到硬盘上面的,如果节点重启或者意外crash掉,消息就会丢失。

    所以就要对消息进行持久化处理。如何持久化,下面具体说明下:

    要想做到消息持久化,必须满足以下三个条件,缺一不可。

    1) Exchange 设置持久化

    2)Queue 设置持久化

    3)Message持久化发送:发送消息设置发送模式deliveryMode=2,代表持久化消息

    (2)设置集群镜像模式

    我们先来介绍下RabbitMQ三种部署模式:

    1)单节点模式:最简单的情况,非集群模式,节点挂了,消息就不能用了。业务可能瘫痪,只能等待。
    2)普通模式:消息只会存在与当前节点中,并不会同步到其他节点,当前节点宕机,有影响的业务会瘫痪,只能等待节点恢复重启可用(必须持久化消息情况下)。
    3)镜像模式:消息会同步到其他节点上,可以设置同步的节点个数,但吞吐量会下降。属于RabbitMQ的HA方案

    为什么设置镜像模式集群,因为队列的内容仅仅存在某一个节点上面,不会存在所有节点上面,所有节点仅仅存放消息结构和元数据。下面自己画了一张图介绍普通集群丢失消息情况:

    RabbitMQ消息丢失怎么防止

    如果想解决上面途中问题,保证消息不丢失,需要采用HA 镜像模式队列。

    下面介绍下三种HA策略模式:

    1)同步至所有的
    2)同步最多N个机器
    3)只同步至符合指定名称的nodes

    命令处理HA策略模版:rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]

    1)为每个以“rock.wechat”开头的队列设置所有节点的镜像,并且设置为自动同步模式
    rabbitmqctl set_policy ha-all "^rock.wechat" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
    rabbitmqctl set_policy -p rock ha-all "^rock.wechat" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

    2)为每个以“rock.wechat.”开头的队列设置两个节点的镜像,并且设置为自动同步模式
    rabbitmqctl set_policy -p rock ha-exacly "^rock.wechat" \
    '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

    3)为每个以“node.”开头的队列分配指定的节点做镜像
    rabbitmqctl set_policy ha-nodes "^nodes\." \
    '{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}'

    但是:HA 镜像队列有一个很大的缺点就是:   系统的吞吐量会有所下降

    (3)消息补偿机制

    为什么还要消息补偿机制呢?难道消息还会丢失,没错,系统是在一个复杂的环境,不要想的太简单了,虽然以上的三种方案,基本可以保证消息的高可用不丢失的问题,

    但是作为有追求的程序员来讲,要绝对保证我的系统的稳定性,有一种危机意识。

    比如:持久化的消息,保存到硬盘过程中,当前队列节点挂了,存储节点硬盘又坏了,消息丢了,怎么办?

    1)生产端首先将业务数据以及消息数据入库,需要在同一个事务中,消息数据入库失败,则整体回滚。

    RabbitMQ消息丢失怎么防止

    2)根据消息表中消息状态,失败则进行消息补偿措施,重新发送消息处理。

    RabbitMQ消息丢失怎么防止

    3.针对消费者

    方案一:ACK确认机制

    多个消费者同时收取消息,比如消息接收到一半的时候,一个消费者死掉了(逻辑复杂时间太长,超时了或者消费被停机或者网络断开链接),如何保证消息不丢?

    使用rabbitmq提供的ack机制,服务端首先关闭rabbitmq的自动ack,然后每次在确保处理完这个消息之后,在代码里手动调用ack。这样就可以避免消息还没有处理完就ack。才把消息从内存删除。

    这样就解决了,即使一个消费者出了问题,但不会同步消息给服务端,会有其他的消费端去消费,保证了消息不丢的case。 

    到此,关于“RabbitMQ消息丢失怎么防止”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    RabbitMQ消息丢失怎么防止

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    RabbitMQ消息丢失怎么防止

    这篇文章主要介绍“RabbitMQ消息丢失怎么防止”,在日常操作中,相信很多人在RabbitMQ消息丢失怎么防止问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”RabbitMQ消息丢失怎么防止”的疑惑有所帮助!
    2023-07-05

    一文看懂RabbitMQ消息丢失如何防止

    这篇文章主要介绍了RabbitMQ消息丢失的场景,以及如何保证信息不丢失,看完这篇文章一定可以帮助你RabbitMQ有更深的理解,需要的朋友可以参考下
    2023-03-24

    RabbitMq消息防丢失功能实现方式讲解

    这篇文章主要介绍了RabbitMq消息防丢失功能实现,RabbitMQ中,消息丢失可以简单的分为两种:客户端丢失和服务端丢失。针对这两种消息丢失,RabbitMQ都给出了相应的解决方案
    2023-01-28

    在redis中防止消息丢失的机制

    在项目中,由于网络问题,我们很难保证生产者发送的消息能100%到达消息队列服务器,也就是说有消息丢失的可能性,因此,生产者就必须具有消息丢失检测和重发机制,这篇文章主要介绍了如何在redis中防止消息丢失,需要的朋友可以参考下
    2023-02-08

    rabbitmq如何保证消息不丢失

    RabbitMQ 提供了多种方式来保证消息不丢失:1. 持久化消息:RabbitMQ 默认将消息存储在内存中,当服务器重启或断电时,消息会丢失。为了避免这种情况,可以将消息持久化到磁盘上。在发送消息时,设置消息的 delivery mode
    2023-10-09

    RabbitMQ宕机后,消息100%不会丢失吗

    你的RabbitMQ部署在线上服务器了,对吧?然后订单服务和仓储服务都可以基于RabbitMQ来收发消息,同时仓储服务宕机,不会导致消息丢失。

    怎么防止gitlab数据丢失

    随着软件开发过程的不断推进,代码托管平台成为了现代软件开发中不可或缺的一部分。Gitlab 作为一个开源的代码托管平台,正被越来越多的团队广泛使用。然而,对于 Gitlab 维护者来说,防止数据丢失是一个非常重要的问题,因为它可能导致项目损
    2023-10-22

    mq怎么避免消息重复和消息丢失

    要避免消息重复和消息丢失,可以采取以下措施:1. 使用独立的消息唯一标识符:在每条消息中添加一个唯一的标识符,可以是消息的ID或者其他唯一标识符,确保消息在系统中唯一。2. 实现幂等性:对于接收到的重复消息,可以在接收端进行幂等性处理,即重
    2023-10-20

    MQ为什么会丢消息?如何保证不丢失消息

    当生产者往 MQ 中写数据时,可能出现网络故障,消息压根就没到达 MQ 内部,生产者端对这个异常没有捕获,不做任何处理,这种场景会导致消息丢失。
    MQ消息磁盘2024-12-03

    一次教会你如何解决RabbitMQ消息丢失问题

    这篇文章,我们转移到消息中间件的生产端,一起来看看如何保证投递到MQ的数据不丢失。

    rabbitmq延迟消息怎么取消

    要取消 RabbitMQ 中的延迟消息,可以通过以下步骤实现:使用 rabbitmq_delayed_message_exchange 插件创建一个延迟交换机。在发送消息时,设置消息的 TTL(Time-To-Live)或者设置消息的过期
    rabbitmq延迟消息怎么取消
    2024-03-04

    怎么防止租用服务器的数据丢失

    要防止租用服务器的数据丢失,可以采取以下措施:定期备份数据:定期备份服务器上的重要数据至其他存储介质,如外部硬盘、云存储等。备份频率可以根据数据变化的频率来确定,以确保备份的及时性。使用高可靠性的硬件:选择租用服务商提供的高可靠性服务器和
    怎么防止租用服务器的数据丢失
    2024-04-22

    rabbitmq怎么删除unacked消息

    要删除RabbitMQ中的unacked消息,您可以使用以下步骤:确定要删除的消息所在的队列和连接。您可以使用RabbitMQ管理界面或命令行工具(如rabbitmqctl)来获取有关连接和队列的详细信息。关闭与该连接相关的消费者。这将使得
    2023-10-27

    mq消息丢失补偿机制是什么

    MQ消息丢失补偿机制是一种在消息中间件(MQ)中,当消息发送或消费遇到异常情况导致消息丢失时,能够进行补偿和保证消息不丢失的一种机制。常见的MQ消息丢失补偿机制有以下几种:1. 重试机制:当消息发送或消费失败时,自动进行重试操作,多次尝试发
    2023-10-20

    rabbitmq怎么删除指定消息

    要删除RabbitMQ中的指定消息,可以使用以下步骤:1. 连接到RabbitMQ服务器。2. 创建一个通道(channel)。3. 使用`basic.get`方法从指定的队列中获取消息。这个方法将返回一个消费者标记(consumer ta
    rabbitmq怎么删除指定消息
    2024-02-29

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录