栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

解决消息丢失问题,保证消息可靠传输

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

解决消息丢失问题,保证消息可靠传输

如何保证消息可靠传输

我们在使用消息队列的过程中,应该做到消息不能多消费,也不能少消费。其实这个可靠性传输,每种MQ都要从三个角度来分析:生产者弄丢数据、消息队列弄丢数据、消费者弄丢数据。

生产者丢数据:第一种解决方法是使用事务,开启事务,发送消息,如果发送异常就事务回滚,如果成功就提交事务。但是采用事务机制实现会降低RabbitMQ的消息吞吐量。

第二种解决方法是采用发送方确认模式/confirm/i模式,生产者将信道设置成/confirm/i模式,一旦信道进入/confirm/i模式,所有在该信道上面发布的消息都将会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后,broker就会发送一个确认给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达目的队列了。/confirm/i模式最大的好处在于他是异步的,一旦发布一条消息,生产者应用程序就可以在等信道返回确认的同时继续发送下一条消息,当消息最终得到确认之后,生产者应用便可以通过回调方法来处理该确认消息,如果RabbitMQ因为自身内部错误导致消息丢失,就会发送一条nack消息,生产者应用程序同样可以在回调方法中处理该nack消息;

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

消费者丢数据:消费者丢数据一般是因为采用了自动确认消息模式。这种模式下,消费者会自动确认收到信息。这时rahbitMQ会立即将消息删除,这种情况下如果消费者出现异常而没能处理该消息,就会丢失该消息。
至于解决方案,采用手动确认消息即可。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/673342.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号