RabbitMQ学习笔记 - 事务机制 2022-01-12 23:07 121阅读 0赞 **参考:<<RabbitMQ实战指南>>** 通过消息持久化可以解决因为服务器的异常崩溃而导致的消息丢失。但是,当消息的生产者将消息发送出去之后,并不能知道消息有没有正确到达服务器。如果不进行特殊配置,默认情况下发送消息的操作是不会返回任何信息给生产者的。 如果消息在到达服务器之前丢失,持久化操作解决不了这个问题,针对这个问题,有两种解决方式: * 事务机制 * 发送方确认机制(publisher confirm) ## 事务机制 ## RabbitMQ客户端中与事务机制相关的三个方法: * channel.txSelect:将当前信道设置为事务模式 * channel.txCommit:提交事务 * channel.txRollback:事务回滚 示例代码: ... // 声明交换器 String exchangeName = "direct.exchange.test.tx"; AMQP.Exchange.DeclareOk declareOk = channel.exchangeDeclare(exchangeName, "direct", true); // 声明队列 String queueName = "direct.queue.test.tx"; channel.queueDeclare(queueName, true, false, false, null); // 绑定交换器和队列 String routingKey = "direct.routing-key.test.tx"; channel.queueBind(queueName, exchangeName, routingKey); try { channel.txSelect(); channel.basicPublish(exchangeName, routingKey, MessageProperties.PERSISTENT_TEXT_PLAIN, "Test Msg".getBytes()); channel.txCommit(); } catch (Exception e) { e.printStackTrace(); channel.txRollback(); } ... 上面代码对应AMQP协议流转过程: * 客户端发送Tx.Select,将信道置为事务模式 * Broker回复Tx.Select-Ok,确认将信道置为事务模式 * 发送完消息之后,客户端发送Tx.Commit提交事务 * Broker回复Tx.Commit-Ok,确认事务提交 * 若在提交事务之前发生异常,客户端发送Tx.Rollback回滚事务 * Broker回复Tx.Rollback-Ok,确认事务回滚 (1)正常情况下事务机制流程: ![AMQP协议流转过程][AMQP] (2)异常情况下回滚流程: ![AMQP协议流转过程][AMQP 1] 注: * 事务确实能够解决发送方和RabbitMQ之间消息确认的问题,只有消息成功被接收,事务才能提交成功,否则捕获异常后进行事务回滚,此时可以进行消息重发。 * 事务机制会使得RabbitMQ的性能急剧下降。 测试: 发送一万条消息,不考虑创建、销毁连接和信道的时间(因机器、网络等环境不同,测试结果差别比较大) * 事务:耗时164814ms * 无事务:耗时367ms 总的来看,加了事务性能下降比较明显,如果不是特别重要的消息,尽量避免使用事务。如果仍然想要保证消息正确投递,那么还可以使用 [<<发送方确认机制>>][Link 1] 。 [AMQP]: /images/20220112/a076a7fcfb8f474eb18a408602e48518.png [AMQP 1]: /images/20220112/73511210c27b4bf28e10b8d3e773e519.png [Link 1]: https://blog.csdn.net/mytt_10566/article/details/92838069 文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。
相关 RabbitMQ消息确认机制之事务机制 一 问题提出 生产者发送消息出去之后,不知道到底有没有发送到RabbitMQ服务器, 默认是不知道的。而且有的时候我们在发送消息之后,后面的逻辑出问题了,我们不想要发送之前的 逃离我推掉我的手/ 2021年08月28日 20:25/ 0 赞/ 314 阅读
相关 RabbitMQ--持久化、事务机制、confirm机制 持久化 交换器的持久化是通过在声明队列是将 durab1e参数置为tue实现的,如果交换器不设置持久化,那么在 RabbitMQ服务重启之后,相关的交换器元数据会丢失,不 短命女/ 2021年08月30日 00:44/ 0 赞/ 219 阅读
相关 RabbitMQ事务以及confirm机制 本文是参考下面这篇博客然后进行复现浓缩后的总结 [https://www.cnblogs.com/vipstone/p/9350075.html][https_www.cn 喜欢ヅ旅行/ 2021年10月15日 14:23/ 0 赞/ 184 阅读
相关 RabbitMQ学习笔记 - 发送方确认机制 参考:<<RabbitMQ实战指南>> RabbitMQ发送消息可能会遇到一个问题,发送方不知道消息是否真正到达了RabbitMQ。 在上篇博客中介绍了在AMQP协议层面 墨蓝/ 2022年01月11日 13:05/ 0 赞/ 127 阅读
相关 RabbitMQ学习笔记 - 事务机制 参考:<<RabbitMQ实战指南>> 通过消息持久化可以解决因为服务器的异常崩溃而导致的消息丢失。但是,当消息的生产者将消息发送出去之后,并不能知道消息有没有正确到达服务器 迈不过友情╰/ 2022年01月12日 23:07/ 0 赞/ 122 阅读
相关 RabbitMQ事务确认机制(生产者) [RabbitMQ事务确认机制(生产者)][RabbitMQ] 消息确认机制 生产者 消费者 消费者如何确保消息一定消费成功 队列和消费者建立 - 日理万妓/ 2022年01月28日 21:57/ 0 赞/ 108 阅读
相关 RabbitMQ—消息确认机制(AMQP事务) 我们知道可以通过持久化(交换机、队列和消息持久化)来保障我们在服务器崩溃时,重启服务器消息数据不会丢失。但是我们无法确认当消息的发布者在将消息发送出去之后,消息到底有没有正确到 Bertha 。/ 2022年04月10日 13:19/ 0 赞/ 292 阅读
相关 RabbitMQ(七):RabbitMQ消息确认机制之事务机制 一、使用RabbitMQ可能存在的问题 1. 服务器异常数据丢失问题 解决方案:采用持久化数据,即声明队列时设置 queueDeclare(String q 蔚落/ 2022年05月23日 12:18/ 0 赞/ 77 阅读
相关 MySql学习笔记——锁与事务机制 为什么需要锁? 因为数据库要解决并发控制问题。在同一时刻,可能会有多个客户端对`Table1.rown`进行操作,比如有的在读取该行数据,其他的尝试去删除它。为了保证数据的一 Bertha 。/ 2022年07月19日 10:18/ 0 赞/ 54 阅读
相关 RabbitMQ学习笔记(四)-消息确认机制 引入 在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。 ╰半夏微凉°/ 2023年01月15日 10:24/ 0 赞/ 53 阅读
还没有评论,来说两句吧...