RabbitMQ 消息丢失的场景,如何保证消息不丢失?
如果需要保证消息在整条链路中不丢失,那就需要生产端、mq自身与消费端共同去保障。对生产的消息进行状态标记,开启confirm机制,依据mq的响应来更新消息状态,使用定时任务重新投递超时的消息,多次投递失败进行报警。开启持久化,并在落盘后再进行ack。如果是镜像部署模式,需要在同步到多个副本之后再进行ack。开启手动ack模式,在业务处理完成后再进行ack,并且需要保证幂等。通过以上的处理,理论上不存在消息丢失的情况,但是系统的吞吐量以及性能有所下降。
一.rabbitmq消息丢失的三种情况
-
第一种:生产者弄丢了数据。生产者将数据发送到 rabbitmq 的时候,可能数据就在半路给搞丢了,因为网络问题啥的,都有可能。
-
第二种:rabbitmq 弄丢了数据。mq还没有持久化自己挂了
-
第三种:消费端弄丢了数据。刚消费到,还没处理,结果进程挂了,比如重启了。
二.rabbitmq消息丢失解决方案

1.针对生产者
方案1 :开启rabbitmq事务
可以选择用 rabbitmq 提供的事务功能,就是生产者发送数据之前开启 rabbitmq 事务channel.txselect
,然后发送消息,如果消息没有成功被 rabbitmq 接收到,那么生产者会收到异常报错,此时就可以回滚事务channel.txrollback
,然后重试发送消息;如果收到了消息,那么可以提交事务channel.txcommit
。
// 开启事务
channel.txselect
try {
// 这里发送消息
} catch (exception e) {
channel.txrollback
// 这里再次重发这条消息
}
// 提交事务
channel.txcommit
缺点:
rabbitmq 事务机制是同步的
相关文章:
-
*默认情况只能在 localhost本机下访问(见下图),所以需要新增一个远程登录的用户。RabbitMQ是一个开源的遵循 AMQP协议实现的基于 Erlang语言编写,即需要先安…
-
一切为本人亲自操作查阅资料进行安装,以及遇到的问题和解决的有效方法,欢迎各位阅读我的博客,然后有效的解决各位的问题(如果我遇到过的话,哈哈!)前提:注意参考Erlang和Rabbi…
-
-
rabbitmq报错私密连接或者user can only log in via localhost,页面访问失败等一些列问题解决思路分享…
-
*** @description 商品搜索管理Service*//*** 从数据库中导入所有商品到ES*//*** 根据id删除商品*//*** 根据id创建商品*//*** 批量…
-
RabbitMQ3.x之二_RabbitMQ所有端口说明及开启后台管理功能…
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论