阅读 73

rabbitmq 消息可靠性投递

解决mq消息可靠性投递,从三个方面解决这个问题

1、消息生产者

2、消息在队列中

3、消息消费者


如图:

image.png


1、发送者丢数据

事务模式

// 将channel设置成事务模式  channel.tsSelect();  // 提交事务  channel.txCommit();  // 事务回滚  channel.txRooback();  // transaction 模式,开启事务, 然后发送消息,如果中途发送出现异常,  // 事务回滚,如果没有异常,事务提交  //  这种方式会导致吞吐量下降。 所以线上用下一种方式居多 复制代码

image.png

image.png


Confirm模式

confirm 模式,每个消息指派唯一id如果,消息发送到了之制定队列 则返回一个ack通知发送者, 如果队列没有接收到消息,则会返回一个nack,会让你去进行重试  // 将channel 设置称为 Confirm 模式  channel.confirmSelect();  if (channel.waitForCofirms()){      // 消息发送成功  } 复制代码


2、消息队列丢数据

进行消息的持久化,这个持久化配置可以和confirm机制配合使用, 你可以在消息持久化磁盘后, 再给生产者发送一个Ack信号。 那么如何持久化呢? 这里顺便说一下吧,其实也很容易,就下面两步 1. 将queue的持久化标识durable设置为true,则代表是一个持久的队列  2. 发送消息的时候将deliveryMode=2 复制代码


3、消费者丢数据

 这种一般发生在消费者自动确认的情况下  消费者虽然受到消息之后,自动发了ack,此时服务器宕机了,此时消息就丢失了  解决办法:关闭自动ack,采用手动ack的方式


作者:南极_熊
链接:https://juejin.cn/post/7025183098270810142


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐