“数据未来·携手跨越” 云祺产品新版本发布暨全国巡展—武汉站 4月26日 星期五 14:00 云祺视频号准时直播
vinchin linked
delta 扫码预约直播,观看精彩内容!
closed
logo
关于我们

技术分享

技术分享 RabbitMQ数据丢失

RabbitMQ数据丢失

2019-04-12

1)生产者弄丢了数据

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

 解决:

RabbitMQ提供transaction和confirm模式来确保生产者不丢消息。transaction机制就是说,发送消息前
开启事物(channel.txSelect()),然后发送消息,如果发送过程中出现什么异常,
事物就会回滚(channel.txRollback()),如果发送成功则提交事物(channel.txCommit())。然而缺点就是吞吐量下降了。
因此,生产上用confirm模式的居多。一旦channel进入confirm模式,所有在该信道上面发布的消息都将会被指派一个唯一的ID(从1开始),
一旦消息被投递到所有匹配的队列之后,rabbitMQ就会发送一个Ack给生产者(包含消息的唯一ID),
这就使得生产者知道消息已经正确到达目的队列了.如果rabiitMQ没能处理该消息,则会发送一个Nack消息给你,你可以进行重试操作。

 

2)rabbitmq弄丢了数据

就是rabbitmq自己弄丢了数据,这个你必须开启rabbitmq的持久化,就是消息写入之后会持久化到磁盘,
哪怕是rabbitmq自己挂了,恢复之后会自动读取之前存储的数据,一般数据不会丢
。除非极其罕见的是,rabbitmq还没持久化,自己就挂了,可能导致少量数据会丢失的,但是这个概率较小。

设置持久化:

MQ丢失数据:
交找机持久化、channel.exchangeDeclare(exchange_name,”topic”,true);
声明交换机、指定类型为topic、设为true
队列持久化、channel.queueDeclare(QUEUE_NAME,true,false,false,null);
声明队列、第二个为true
消自持久化、channel.basicPublish(exchange_name,”item.update”,MessageProperties.PERSISTENT_TEXT_PLAIN,MESSAGE.GETbYTES());
MESSAGEPROPER...为持久化

 解决: 

处理消息队列丢数据的情况,一般是开启持久化磁盘的配置。这个持久化配置可以和confirm机制配合使用,
你可以在消息持久化磁盘后,再给生产者发送一个Ack信号。
这样,如果消息持久化磁盘之前,rabbitMQ阵亡了,那么生产者收不到Ack信号,生产者会自动重发。

 

3)消费端弄丢了数据

rabbitmq如果丢失了数据,主要是因为你消费的时候,刚消费到,还没处理,
结果进程挂了,比如重启了,那么就尴尬了,rabbitmq认为你都消费了,这数据就丢了。

 解决:

启用手动确认模式可以解决这个问题(重试机制)
手动确认模式,如果消费者来不及处理就死掉时,没有响应ack时会重复发送一条信息给其他消费者;
如果监听程序处理异常了,且未对异常进行捕获,会一直重复接收消息,然后一直抛异常;
如果对异常进行了捕获,但是没有在finally里ack,也会一直重复发送消息(重试机制)。

 

云祺备份软件,云祺容灾备份系统,虚拟机备份,数据库备份,文件备份,实时备份,勒索软件,美国,图书馆
  • 标签:
  • 其他

您可能感兴趣的新闻 换一批

现在下载,可享30天免费试用

立即下载