解决RabbitMQ数据丢失

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,也会一直重复发送消息(重试机制)。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值