当前位置: 代码网 > it编程>前端脚本>Erlang > RabbitMQ 消息丢失的场景,如何保证消息不丢失?

RabbitMQ 消息丢失的场景,如何保证消息不丢失?

2024年07月28日 Erlang 我要评论
如果需要保证消息在整条链路中不丢失,那就需要生产端、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 事务机制是同步的

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com