RabbitMQ 事务

事务简介

  就像我们了解的MySQL中的事务一样,RabbiMQ的事务也具备原子性和一致性,并且RabbiMQ的事务是针对消息从生产者发送到RabbitMQ中提供的支持,因此不同事务可以同时给同一个队列发送信息。
  可通过channel.txSelect,channel.txCommit,channel.txRollback三个方法实现事务机制。它们分别对应开启事务,提交事务以及事务回滚。如果事务提交成功,则消息一定到达了Rabbimq中,但并不能证明消息一定能入队!
在这里插入图片描述
如上图所示,待事务提交后,所有该事务内接收到的消息进行统一入队。

事务的使用

  事务的使用java实现如下代码所示:

try{// 该信道开启事务channel.txSelect();channel.basicPublish(EXCHANGE_NAME,ROUTING_KEY + 1,null,message.getBytes());// 事务提交channel.txCommit();}catch (Exception e){e.printStackTrace();// 发生异常时进行事务回滚channel.txRollback();}

  上述代码针对开启事务、提交事务、回滚事务进行了展示。在发送消息之前开启事务,当消息发送完成后进行事务提交,如果发生异常则进行事务回滚。
  在使用事务的过程中需要注意以下问题:

  • 事务提交之前,RabbiMQ接收到消息并不会针对消息进行分发入队操作,也就是说事务提交之前消费者是接收不到事务中的消息的。
  • 一旦事务提交成功,则仅能证明消息发送给RabbitMQ过程中没有发生问题,换句话说就是RabbitMQ成功的接收到了消息,并且存在可以处理该消息的交换机。但并能保证该消息一定可以入队,也可能会存在消息无法路由到队列中的情况。
  • 连接异常、信道关闭、交换机不存在会导致消息发送出现异常,这种异常可以被生产者接收并处理,然后进行消息回退。
  • 事务机制在一条消息发送之后会使发送端阻塞,以等待RabbitMQ的回应,之后才能继续放下一条消息。
  • 从测试的角度而言:如果可以入队,则入队成功后算是事务提交成功,如果需要持久化则入队持久化后返回事务成功,如果不能入队则入队失败后返回事务成功。只要交换机可以接收到消息,则一定返回事务成功,但具体返回的时机受消息入队和持久化的影响。

事务能解决的问题

  根据上述对RabbitMQ的描述,可知在实际使用过程中事务机制可以为我们解决以下问题:

  • 确保RabbitMQ接收到消息,并且存在可以处理该消息的交换机。也就是说一旦事务提交成功,则消息一定可以交由其指定的交换机进行处理;事务机制是从AMQP协议层面确保了消息一定合法的到达了RabbitMQ中。
  • 保证消息们的原子性和一致性,事务内发送的消息要么全都成功,要么全都失败。

  事务虽然能给我们解决一些问题,但是使用事务的过程中消息的发送需要增加一次事务开启和事务提交请求,如果仅仅使用事务确保消息合法的到达RabbitMQ中,那么每次发送一条消息都将开启事务和提交事务,这无疑会浪费资源,因此不建议使用事务确保消息合法发送,可使用发送方确认机制确保消息到达了RabbitMQ。事务更适合的场景是:多条消息期望要么都成功发送要么都不发送的业务需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/63719.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android侧滑栏(一)可缩放可一起移动的侧滑栏

在实际的各类App开发中,经常会需要做一个左侧的侧滑栏,类似于QQ这种。 今天这篇文章总结下自己在开发中遇到的这类可以跟随移动且可以缩放的侧滑栏。 一、实现原理 使用 HorizontalScrollView 实现一个水平方向的可滑动的View,左布局为侧滑…

MySQL多表关联查询

目录 1. inner join: 2. left join: 3. right join: 4.自连接 5.交叉连接: 6、联合查询 7、子查询 1. inner join: 代表选择的是两个表的交差部分。 内连接就是表间的主键与外键相连,只取得键值一致…

Grafana展示k8s中pod的jvm监控面板/actuator/prometheus

场景 为保障java服务正常运行,对服务的jvm进行监控,通过使用actuator组件监控jvm情况,使用prometheus对数据进行采集,并在Grafana展现。 基于k8s场景 prometheus数据收集 配置service的lable,便于prometheus使用labl…

【ES6】深入理解ES6(1)

一、块级作用域绑定 var声明及变量提升机制 二、字符串和正则表达式 字符串(String)是JavaScript6大原始数据类型。其他几个分别是Boolean、Null、Undefined、Number、Symbol(es6新增)。 更好的Unicode支持 1. UTF-16码位 字…

【Archaius技术专题】「Netflix原生态」动态化配置服务之微服务配置组件变色龙

前提介绍 如果要设计开发一套微服务基础架构,参数化配置是一个非常重要的点,而Netflix也开源了一个叫变色龙Archaius的配置中心客户端,而且Archaius可以说是比其他客户端具备更多生产级特性,也更灵活。*在NetflixOSS微服务技术栈…

《Java-SE-第三十四章》之Optional

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页:KC老衲爱尼姑的博客主页 博主的github,平常所写代码皆在于此 共勉:talk is cheap, show me the code 作者是爪哇岛的新手,水平很有限&…

RFID工业识别技术:供应链智能化的科技颠覆

RFID工业识别技术,作为物联网的先锋,正在供应链管理领域展现着前所未有的科技颠覆。从物料追踪到库存管理,再到物流配送,RFID技术以其高效的数据采集和智能的自动化处理,彻底改变着传统供应链的运营方式。 RFID在物料追…

全国各城市-货物进出口总额和利用外资-外商直接投资额实际使用额(1999-2020年)

最新数据显示,全国各城市外商直接投资额实际使用额在过去一年中呈现了稳步增长的趋势。这一数据为研究者提供了对中国外商投资活动的全面了解,并对未来投资趋势和政策制定提供了重要参考。 首先,这一数据反映了中国各城市作为外商投资的热门目…

Prometheus入门

Prometheus(普罗米修斯) 是一种 新型监控告警工具,Kubernetes 的流行带动了 Prometheus 的应用。 全文参考自 prometheus 学习笔记(1)-mac 单机版环境搭建[1] Mac 上安装 Prometheus brew install prometheus 安装路径在 /usr/local/Cellar/prometheus/2.20.1, 配置文件在 /usr…

群晖安装wireguard(群晖7.1)

前言 上篇文章介绍了乌班图如何安装wireguard,但是感觉虚拟机安装有损优雅性。 本期视频我们介绍使用群晖安装wireguard。 由于原来黑群晖内核版本太低了。 我这里升级到群晖dns918(7.1版本) 内核版本为4.4 实际上这仍然不满足wireguar…

k8s之StorageClass(NFS)

一、前言 1、环境 k8s v1.23.5 ,服务器是centos7.9 192.168.164.20 k8s-master1 192.168.164.30 k8s-node1 192.168.164.40 k8s-node2 2、貌似storageClass在kubernetes v1.20就被砍了。 因为它比较慢,而且耗资源,但可以通过不同的实现镜…

SpringBoot启动图标替换-banner文件

1.banner.txt文件内容如下 ${AnsiColor.BRIGHT_YELLOW}${AnsiStyle.BOLD}_________ .__ __________ __ / _____/____________|__| ____ ____\______ \ ____ _____/ |_ \_____ \\____ \_ __ \ |/ \ / ___\| | _//…