网站上的公告怎么做参考文献,网站建设分金手指专业二五,网盘资源搜索神器,wordpress 联系我们目录1.生产者没有成功把消息发送到MQ2.RabbitMQ接收到消息之后丢失了消息3.消费者弄丢了消息前言 首先明确一点一条消息的传送流程#xff1a;生产者-MQ-消费者 我们根据这三个依次讨论
1.生产者没有成功把消息发送到MQ
丢失的原因#xff1a;因为网络传输的不稳定…
目录1.生产者没有成功把消息发送到MQ2.RabbitMQ接收到消息之后丢失了消息3.消费者弄丢了消息前言 首先明确一点一条消息的传送流程生产者-MQ-消费者 我们根据这三个依次讨论
1.生产者没有成功把消息发送到MQ
丢失的原因因为网络传输的不稳定性当生产者在向MQ发送消息的过程中MQ没有成功接收到消息但是生产者却以为MQ成功接收到了消息不会再次重复发送该消息从而导致消息的丢失。 解决办法 有两个解决办法事务机制和confirm机制最常用的是confirm机制。 事务机制和cnofirm机制最大的不同在于事务机制是同步的你提交一个事务之后会阻塞在那儿但是confirm机制是异步的你发送个消息之后就可以发送下一个消息然后那个消息rabbitmq接收了之后会异步回调你一个接口通知你这个消息接收到了。 我们就谈谈confirm return(扩展一下) rabbitmq 整个消息投递的路径为 producer—rabbitmq broker—exchange—queue—consumer 消息从 producer 到 exchange 则会返回一个 confirmCallback 。 消息从 exchange–queue 投递失败则会返回一个 returnCallback 。
confirm:使用 rabbitTemplate.setConfirmCallback 设置回调函数。当消息发送到 exchange 后回调 confirm 方法。在方法中判断 ack如果为true则发送成功如果为false则发送失败需要处理。
return:使用 rabbitTemplate.setReturnCallback 设置退回函数当消息从exchange 路由到 queue 失败后如果设置了 rabbitTemplate.setMandatory(true) 参数则会将消息退回给 producer并执行回调函数returnedMessage
2.RabbitMQ接收到消息之后丢失了消息
丢失的原因RabbitMQ接收到生产者发送过来的消息是存在内存中的如果没有被消费完此时RabbitMQ宕机了那么再次启动的时候原来内存中的那些消息都丢失了。 解决方案开启RabbitMQ的持久化。当生产者把消息成功写入RabbitMQ之后RabbitMQ就把消息持久化到磁盘。(持久化要起作用必须同时设置这两个持久化才行)
持久化可以跟生产者那边的confirm机制配合起来只有消息被持久化到磁盘之后才会通知生产者ack了所以哪怕是在持久化到磁盘之前rabbitmq挂了数据丢了生产者收不到ack你也是可以自己重发的。若生产者那边的confirm机制未开启的情况下哪怕是你给rabbitmq开启了持久化机制也有一种可能就是这个消息写到了rabbitmq中但是还没来得及持久化到磁盘上结果不巧此时rabbitmq挂了就会导致内存里的一点点数据会丢失。
3.消费者弄丢了消息
丢失的原因如果RabbitMQ成功的把消息发送给了消费者那么RabbitMQ的ack机制会自动的返回成功表明发送消息成功下次就不会发送这个消息。但如果就在此时消费者还没处理完该消息然后宕机了那么这个消息就丢失了。 解决的办法简单来说就是必须关闭 RabbitMQ 的自动 ack none自动确认manual手动确认 如果在消费端没有出现异常则调用channel.basicAck(deliveryTagtrue);方法确认签收消息 如果出现异常则在catch中调用 basicNack拒绝消息让MQ重新发送消息。