关于我们
技术分享
技术分享
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天免费试用