首页 > 其他分享 >RabbitMQ可能存在的数据丢失问题

RabbitMQ可能存在的数据丢失问题

时间:2022-11-05 17:55:09浏览次数:41  
标签:持久 生产者 rabbitmq 发送 丢失 RabbitMQ 数据 消息

RabbitMQ使用过程中,可能存在数据丢失的情况,在生产者、RabbitMQ、消费者之间进行数据传输及逻辑处理过程中均有可能会出现数据丢失问题。

1. 生产者弄丢了数据

生产者将数据发送到rabbitmq的时候,可能数据在半路给搞丢了,比如因为网络问题等。
此时可以采用rabbitmq提供的事务功能,就是生产者发送数据之前开启rabbitmq事务(channel.txSelect),然后发送消息,如果消息没有成功被rabbitmq接收到,那么生产者会收到异常报错,此时就可以回滚事务(channel.txRollback),然后重试发送消息;如果收到了消息,那么可以提交事务(channel.txCommit)。但是问题是,rabbitmq事务一开,会同步阻塞卡住,基本上吞吐量会下来,因为太耗性能了。可以采取confirm机制:

    1先将channel设置为confirm模式
    2生产者发送一个消息
    3发送消息完成后生产者不管了
    4rabbitmq如果接收到了发送的消息,就会回调生产者本地的接口,通知生产者收到发送的消息
    5rabbitmq如果在接收消息的时候出现异常,就会回调接口,通知生产者消息接受失败,可再次重发消息
生产者要保证不丢失数据,一般使用confirm机制,异步的模式发送消息后不会阻塞下一个消息的发送,不会造成吞吐量的降低。

2. rabbitmq弄丢了数据
RabbitMQ自己弄丢数据的情况,需要开启rabbitmq的持久化,在消息写入后持久化到磁盘,设置持久化有两个步骤:

    1创建queue的时候将其设置为持久化,保证rabbitmq持久化queue的元数据,但是不会持久化queue里面的数据。
    2发送消息的时候将消息的deliveryMode设置为2,即将消息设置为持久化的,此时rabbitmq就会将消息持久化到磁盘中。
必须要同时设置这两个持久化。且持久化可以跟生产者的confirm机制配合,只有当消息被持久化到磁盘后,才会通知生产者。

3. 消费者弄丢了数据
消费者刚收到消息,结果进程挂了,比如重启了,rabbitmq就会认为消费者已经消费,造成数据丢失。
可以使用rabbitmq的ack机制,关闭rabbitmq的自动ack。

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

每次消费者处理完成之后,通过api手动ack,如果没处理完或者是处理异常,就没有ack,rabbitmq会把这个消费分配给别的consumer(消费者)处理,消息不会丢失。

标签:持久,生产者,rabbitmq,发送,丢失,RabbitMQ,数据,消息
From: https://www.cnblogs.com/wangfeng2013/p/16860730.html

相关文章

  • 筛选出带字母和数据
     问题:一列数据中,一部分内容是数字,另一部分内容是数字和字母混合,要筛选出其中之一解决:添加辅助列,使用以下公式=ISNUMBER(-CLEAN(A2))再根据辅助列筛选 思路:A......
  • 常用数据数据类型
    数据类型原始数据类型(6种)Undefinedundefined值是由null的值派生过来的,因此表面上是相等的Null(在逻辑上可以表示一个空指针对象)BooleanStringNumberNaN(......
  • golang-gin-gorm-viper实现数据简单的增删改查
    目录结构:配置文件:app:addr:127.0.0.1:8888mysql:host:172.xx.xx.xxport:3306user:rootpassword:rootdatabase:ginenable:truegorm:......
  • robotframework自动化测试框架实战教程:测试数据文档工具(Testdoc)
    生成文档的数据源可以是单个文件,单个目录,也可以是多个文件和目录.所有这些情况,最后那个参数都必须是最终文档输出要写入的文件.基本用法python-mrobot.testdoc......
  • 学习笔记——元数据、blob类型的元素
    2022-11-04一、元数据1、元数据的说明:元数据就是指描述数据的数据,例如:数据有多少列、数据的列名称等。2、使用的代码:1ResultSetMetaDatametaData=rs.getMeta......
  • 数据库连接池
    用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数......
  • 解决在idea中使用springMvc向mysql写入中文数据乱码
    相关设置:1、idea编码格式设置:   2、MySQL的相关编码格式设置:修改前编码:无用操作:之前通过命令行修改编码格式:setcharacter_set_client=utf8......
  • 更___的小数据打表/输出样例
    #include<bits/stdc++.h>#defineELputs("Elaina")#defineregregisterintusingnamespacestd;enumkawaii{yoshino=2,koishi=3,yomi=16}suki;inlinevoidMyDear......
  • C# tree view节点解析数据+model、DAL、TOOl
    EnginneModel.csnamespaceWindowsFormsApp3{publicclassEnginneModel{publicstringparamsName{get;set;}publicstringparamsT......
  • 数据结构基本知识
    数据结构主要研究非数值计算问题数据结构是带“结构”的数据元素的集合算法+数据结构=程序 数据:是客观事物的符号表示,是所有能输入计算机中并被计算机程序处理的符号......