当前位置: 首页 > article >正文

面试官:聊聊RocketMQ事务消息?

知识回顾本文不讲什么是 RocketMQ 不讲它的实现原理只想和大家探讨下它的事务消息的正确使用方式再探讨之前先带大家回顾下知识点事务消息的设计原理RocketMQ 在 4.3.0 版中已经支持分布式事务消息采用 2PC 的思想实现事务消息提交同时增加一个补偿逻辑来处理二阶段超时或者失败的消息如下图所示什么英文看不懂贴心的我早已想到中文版的也有其中有两个点半事务、回查事务状态值得我们重点回顾Half 消息何谓 half 消息消息发送方把消息发送到 MQ 服务但是此消息的状态被标记为不能投递处于这种状态下的消息称为 half 消息消费方不能消费 half 消息发送方对 half 消息二次确认后也就是 Commit 之后消费方才可以消费到如果是 Rollback该消息则会被删除永远不会被消费到事务状态回查如果在 RocketMQ 事务消息的二阶段过程中失败了例如在做 Commit 操作时上图中的第 4 步出现网络问题导致 Commit 失败那么需要通过一定的策略使这条消息最终被 CommitRocketMQ 采用了一种补偿机制称为“回查”。Broker 端对未确定状态的消息发起回查将消息发送到对应的 Producer 端同一个 Group 的 Producer由 Producer 根据消息来检查本地事务的状态进而执行 Commit 或者 Rollback值得注意的是RocketMQ 并不会无休止的的信息事务状态回查默认回查 15 次如果 15 次回查还是无法得知事务状态RocketMQ 默认回滚该消息更多细节请查看事务消息实战示例理论知识理解之后就需要我们进行实操与分析了需求背景假设我们有两个服务订单服务、积分服务当用户成功下单之后需要给用户加相应的积分实现方式有很多种你知道哪些假设我们用 RocketMQ 事务消息来保证最终一致性我们又该如何实现环境准备RocketMQ4.8.0rocketmq-client4.9.2Spring Boot2.1.0.RELEASEMySQL5.7.29MyBatis Plus3.4.2建表 SQLView Code项目地址spring-boot-rocketmq-orderspring-boot-rocketmq-points后续只会对关键代码进行讲解所以建议大家把代码 down 下来看看保证有个基本的印象回到标题楼主为什么会强调正确的打开方式你猜对了RocketMQ 事务消息的使用方式有很多种楼主就结合工作项目中的使用方式来和大家一起讨论下哪些方式是正确的哪些方式是不正确的以及不正确的原因结合 Half 消息发送的时机大致可分为三种根据 half 消息的位置我们暂且将这三种方式命名为half 消息后置、half 消息中置、half 消息前置我们逐个来讨论使用是否正确half 消息后置这种方式有没有觉得似曾相识与发普通消息是不是很类似 本地业务执行完之后发普通消息给积分中心是不是熟悉的味道但还是有区别的至少有回查机制我们结合伪代码具体看看我们来分析下各种异常情况看看这种方式是否有问题1、订单数据或订单事务日志落库异常事务回滚half 消息不会发送没问题2、half 消息发送异常事务会回滚没问题3、half 消息发送未发生异常但返回的不是 SEND_OK 状态代码抛出了异常事务回滚没问题思考如果我们不关注 half 消息发送的结果像这样最终消息会推送给积分服务吗虽然看起来怪怪的但又挑不出毛病half 消息中置我们直接看伪代码我们来分析下各种异常情况看看这种方式是否有问题1、订单数据落库异常事务回滚half 消息不会发送没问题2、half 消息发送异常事务会回滚没问题3、half 消息发送未发生异常但返回的不是 SEND_OK 状态代码抛出异常事务会回滚没问题思考与之前的思考问题一样如果我们不关注 half 消息发送的结果最终消息会推送给积分服务吗只有发送 half 消息成功并且发送状态为 SEND_OK 才会执行 executeLocalTransaction 向 t_order_transaction_log 表写入事务日志那么即使 Broker 回查事务状态它得到的结果始终是 UNKNOW 最终 half 消息会被回滚积分服务收不到消息导致的问题就是用户下单成功但却没有增加积分可见关注 half 消息发送结果的重要性4、half 消息发送成功且返回的是 SEND_OK 状态但 executeLocalTransaction 执行异常了会是什么结果代码很明显我们进行了 catch 异常不会向上抛订单落库还是成功的只是订单事务日志落库失败了返回 ROLLBACK_MESSAGE half 消息会回滚积分服务收不到消息那么同样的问题又出现了用户下单成功但却没有增加积分如果我们不 catch 像这样理论上来讲异常往上抛订单数据会回滚 Broker 回查事务状态一直返回 UNKNOW 最终积分服务收不到消息理论上来讲没问题但事实呢 我们来实践一下哦豁竟然没有打印异常日志也就说异常被 catch 没有往外抛订单数据也落库了那么又会出现同样的问题用户下单成功但却没有增加积分至于谁把异常 catch 了没往外抛相信大家都能想到这算是 rocketmq-client 的一个 bug 源码稍后再跟我们先看完前置half 消息前置直接上伪代码我们来分析下各种异常情况看看这种方式是否有问题1、half 消息发送异常本地事务不会执行没问题2、half 消息发送未发生异常但返回的不是 SEND_OK 状态代码抛出异常本地事务不会执行没问题思考与之前的思考问题一样如果我们不关注 half 消息发送的结果会是什么结果只有 half 消息发送成功且返回状态是 SEND_OK 才会执行 executeLocalTransaction即使 Broker 回查事务状态得到的结果始终是 UNKNOW 最终 half 消息会被回滚积分服务收不到消息订单服务与积分服务都没有落库成功也就说是没问题的3、half 消息发送成功且返回的状态是 SEND_OK 但 executeLocalTransaction 执行异常了会是什么结果也就是 save 方法执行异常了我们来实践下异常还是被 catch 了没往外抛但是订单数据却回滚了就结果而言是没问题的half 消息发送成功了但是 Broker 一直未收到本地事务的确认消息 Broker 会回查得到的结果始终是 UNKNOW 最终 half 消息会被回滚积分服务收不到消息订单数据回滚了积分服务未收到消息那么此种情况是没问题的看起来挺顺眼异常情况下也没什么问题rocketmq-client 的 bug需要弄清楚的问题有两个1、half 消息中置 executeLocalTransaction 的异常为什么没有抛出来2、half 消息前置 异常同样没有抛出来为什么订单数据却回滚了先看第一个问题我们来跟下源码rocketmq-client 捕获了异常但并未向外抛其实 RocketMQ 是有打印日志的只是楼主的日志配置的不对导致控制台未打印出来对于第 1 个问题相信大家已经清楚了关于第 2 个问题我就不具体分析了我给个提示从事务 AOP 的控制范围与异常抛出点来考虑如下图最终一致性前面讲了那么多都是讲的订单服务总结起来就是事务消息而非 half 消息发送成功那么本地事务一定是执行成功的保证的是事务消息的发送与订单服务的强一致如果积分服务消费异常呢那对不起RocketMQ 事务消息处理不了这种情况回滚不了订单服务的数据只能通过补偿机制比如人工修复修复积分服务的数据总结1、三种方式的抉择half 消息中置问题比较多不推荐half 消息后置看起来挺别扭的难道只是楼主这么觉得倒是没什么问题half 消息前置符合 RocketMQ 事务消息的设计原理推荐采用此种方式2、一定要关注 half 消息发送的结果不抛异常不代表一定成功了必要时需要根据 half 消息发送的结果做后续逻辑处理3、最终一致性RocketMQ 考虑的是数据最终一致性上游服务提交之后下游服务最终只能成功做不到回滚上游服务的数据

相关文章:

面试官:聊聊RocketMQ事务消息?

知识回顾 本文不讲什么是 RocketMQ ,不讲它的实现原理,只想和大家探讨下它的事务消息的正确使用方式 再探讨之前,先带大家回顾下知识点 事务消息的设计原理 RocketMQ 在 4.3.0 版中已经支持分布式事务消息,采用 2PC 的思想实现事务…...

【LeetCode刷题日记】225.用队列实现栈--三招实现栈操作(多种思维)

🔥个人主页:北极的代码(欢迎来访) 🎬作者简介:java后端学习者 ❄️个人专栏:苍穹外卖日记,SSM框架深入,JavaWeb ✨命运的结局尽可永在,不屈的挑战却不可须臾或…...

MobileAgent:基于多模态大模型的手机UI自动化操作实践

1. 项目概述:当你的手机学会“自己动手”最近在捣鼓一个挺有意思的开源项目,叫X-PLUG/MobileAgent。简单来说,它能让你的手机“长眼睛”和“会思考”,然后自己动手去完成你交代的任务。这听起来是不是有点像科幻电影里的场景&…...

从零开始开发Google Drive CLI Client自定义命令:完整实践指南

从零开始开发Google Drive CLI Client自定义命令:完整实践指南 【免费下载链接】gdrive Google Drive CLI Client 项目地址: https://gitcode.com/gh_mirrors/gd/gdrive Google Drive CLI Client(gd/gdrive)是一款功能强大的命令行工具…...

掌握Go策略模式:golang-design-pattern中的终极算法动态切换指南

掌握Go策略模式:golang-design-pattern中的终极算法动态切换指南 【免费下载链接】golang-design-pattern 设计模式 Golang实现-《研磨设计模式》读书笔记 项目地址: https://gitcode.com/gh_mirrors/go/golang-design-pattern 在软件开发中&…...

5分钟实现智慧树视频自动播放:学生党必备的刷课神器终极指南

5分钟实现智慧树视频自动播放:学生党必备的刷课神器终极指南 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台繁琐的视频学习而烦恼吗&…...

终极指南:Exposed连接参数调优从连接超时到查询超时的完整解决方案

终极指南:Exposed连接参数调优从连接超时到查询超时的完整解决方案 【免费下载链接】Exposed Kotlin SQL Framework 项目地址: https://gitcode.com/gh_mirrors/ex/Exposed Exposed作为一款强大的Kotlin SQL框架,其连接参数的优化直接影响应用性能…...

AI Agent开发核心技术解析:ReAct、CoT与Tool Use深度剖析

上一篇我们用Coze零代码搭了一个Agent。但如果你想真正理解AI Agent的工作原理,或者想用代码开发更强大的Agent,就必须掌握这三大核心技术:ReAct、Chain-of-Thought和Tool Use。今天,我们把黑盒打开。 一、为什么需要这些技术? 1.1 大模型的原生局限 大语言模型(LLM)很…...

3大智能突破:重新定义百度网盘下载体验

3大智能突破:重新定义百度网盘下载体验 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾在深夜急需下载一份重要文件,却因百度网盘的限速而焦虑…...

Blender3mfFormat终极指南:在Blender中完美处理3D打印文件

Blender3mfFormat终极指南:在Blender中完美处理3D打印文件 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 还在为3D打印文件格式转换而烦恼吗?Ble…...

2024终极指南:如何选择开源疫情监测系统?10款顶尖工具深度对比

2024终极指南:如何选择开源疫情监测系统?10款顶尖工具深度对比 【免费下载链接】awesome-healthcare Curated list of awesome open source healthcare software, libraries, tools and resources. 项目地址: https://gitcode.com/GitHub_Trending/aw/…...

jless YAML文件支持的终极指南:自动检测与手动指定格式的完整教程

jless YAML文件支持的终极指南:自动检测与手动指定格式的完整教程 【免费下载链接】jless jless is a command-line JSON viewer designed for reading, exploring, and searching through JSON data. 项目地址: https://gitcode.com/gh_mirrors/jl/jless jl…...

C++ 位运算(Bitwise Operations)全解

C 位运算&#xff08;Bitwise Operations&#xff09;全解主题要点示例位运算符& ^ ~ << >>为什么要学位运算&#xff1f;速度快&#xff08;直接映射到 CPU 指令&#xff09;代码简洁&#xff08;掩码常常减少 loops&#xff09;低级硬件控制&#xff08;配合…...

VBA-JSON实战宝典:解锁Excel数据处理的无限可能

VBA-JSON实战宝典&#xff1a;解锁Excel数据处理的无限可能 【免费下载链接】VBA-JSON JSON conversion and parsing for VBA 项目地址: https://gitcode.com/gh_mirrors/vb/VBA-JSON VBA-JSON是一款强大的JSON转换与解析工具&#xff0c;专为VBA&#xff08;Windows和M…...

如何高效使用Python工具实现百度网盘真实下载地址解析

如何高效使用Python工具实现百度网盘真实下载地址解析 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 百度网盘解析工具是一款基于Python开发的实用工具&#xff0c;专门用于提…...

Python逆向工程实战:如何绕过百度网盘限制获取真实下载地址

Python逆向工程实战&#xff1a;如何绕过百度网盘限制获取真实下载地址 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 在当今数据驱动的时代&#xff0c;百度网盘作为国内最大…...

Spring AI MCP服务如何选择使用 WebMVC还是WebFlux

在 Spring AI MCP 服务中选择使用 WebMVC 还是 WebFlux&#xff0c;主要取决于你项目的技术栈和性能需求。 简单来说&#xff0c;如果你的项目是传统的 Spring MVC 应用&#xff0c;就选 WebMVC&#xff1b;如果是响应式编程项目或需要处理高并发&#xff0c;就选 WebFlux。 下…...

离线完成上下位机时间同步(硬PTP和软NTP)

一、需求为了满足业务软件正常运行&#xff0c;需要配置时间同步一般的场景分为以下几种1、无时同设备需要对Linux系统之间进行软同步2、有时同设备需要对Linux系统之间进行硬同步3、无时同设备需要对Windows和Linux系统之间进行软同步4、有时同设备需要对Windows和Linux系统之…...

神经网络学习率调优指南与实战技巧

1. 学习率对神经网络性能的影响概述在训练神经网络时&#xff0c;学习率(Learning Rate)可能是最关键的单一超参数。它决定了每次参数更新的步长大小&#xff0c;直接影响着模型收敛的速度和质量。想象一下你在下山&#xff1a;学习率就像你每一步迈出的距离 - 步子太大可能越过…...

Phi-4-mini-flash-reasoning部署指南:Web工作台一键启用长文本推理

Phi-4-mini-flash-reasoning部署指南&#xff1a;Web工作台一键启用长文本推理 1. 模型介绍 Phi-4-mini-flash-reasoning 是一款专为复杂推理任务优化的轻量级文本模型&#xff0c;特别适合需要多步思考和分析的场景。不同于常规的文本生成模型&#xff0c;它更擅长&#xff…...

Casdoor开源身份认证平台:基于OAuth 2.0/OIDC的统一登录解决方案

1. 项目概述&#xff1a;一个开源的统一身份认证与单点登录平台如果你正在为一个新项目搭建用户系统&#xff0c;或者正在为手头一堆各自为政的应用&#xff08;比如内部的OA、CRM、知识库&#xff09;如何统一登录而头疼&#xff0c;那么你很可能需要了解Casdoor。简单来说&am…...

FastAPI部署机器学习模型:实战指南与性能优化

1. 机器学习模型部署实战&#xff1a;基于FastAPI的完整指南作为一名长期奋战在机器学习一线的工程师&#xff0c;我深知模型部署是许多同行最头疼的环节。今天我将分享一个经过生产验证的解决方案——使用FastAPI构建轻量级预测API。这个方案已经支撑了我们团队80%的中小型模型…...

平板电脑Linux内核显示配置实战:绕过HDMI探测,手动指定DP-1接口与分辨率

平板电脑Linux内核显示配置实战&#xff1a;绕过HDMI探测&#xff0c;手动指定DP-1接口与分辨率 在嵌入式设备开发中&#xff0c;显示配置往往是工程师面临的第一个挑战。不同于标准PC环境&#xff0c;平板电脑、工控设备等定制化硬件通常采用固定连接的显示屏&#xff0c;缺乏…...

别再折腾VCS破解了!用Iverilog+GTKWave在Ubuntu 20.04上快速搭建数字电路仿真环境

开源数字电路仿真指南&#xff1a;Iverilog与GTKWave高效工作流搭建 在数字电路设计与验证领域&#xff0c;商业EDA工具虽然功能强大&#xff0c;但其复杂的安装流程、高昂的授权费用和苛刻的运行环境要求常常让初学者望而却步。对于高校学生、硬件爱好者和初创团队而言&#x…...

告别虚拟机!在Win10上原生运行ROS Melodic/Foxy的保姆级配置指南(含VS2022适配)

在Windows 10上原生运行ROS Melodic/Foxy的终极指南&#xff08;VS2022适配版&#xff09; 对于机器人开发者而言&#xff0c;长期依赖虚拟机运行ROS不仅消耗系统资源&#xff0c;还会导致开发效率低下。本文将彻底解决这一痛点&#xff0c;手把手教你如何在Windows 10上原生配…...

ToolEmu:用LLM模拟工具测试AI代理安全性的框架解析与实践

1. 项目概述&#xff1a;用大语言模型“模拟”工具&#xff0c;提前发现AI代理的风险如果你正在开发或者使用基于大语言模型的智能代理&#xff0c;比如让GPT-4去调用搜索引擎、操作数据库、发送邮件&#xff0c;那你一定思考过这个问题&#xff1a;我怎么知道它不会捅出大篓子…...

WeDLM-7B-Base开源大模型教程:Diffusion LM与AR模型本质差异

WeDLM-7B-Base开源大模型教程&#xff1a;Diffusion LM与AR模型本质差异 1. 认识WeDLM-7B-Base模型 WeDLM-7B-Base是一款基于扩散机制&#xff08;Diffusion&#xff09;的70亿参数高性能语言模型。与传统的自回归&#xff08;AR&#xff09;模型不同&#xff0c;它采用创新的…...

从‘相似用户挖掘’实战出发:手把手教你用Faiss构建你的第一个向量检索系统

从‘相似用户挖掘’实战出发&#xff1a;手把手教你用Faiss构建你的第一个向量检索系统 在推荐系统和精准营销领域&#xff0c;寻找相似用户&#xff08;Look-alike&#xff09;是一项基础但关键的任务。想象一下&#xff0c;你手头有一批高价值用户&#xff0c;如何快速找到与…...

WeDLM-7B-Base一文详解:32K上下文扩散语言模型的推理加速与精度平衡

WeDLM-7B-Base一文详解&#xff1a;32K上下文扩散语言模型的推理加速与精度平衡 1. 模型概述 WeDLM-7B-Base是一款基于扩散机制&#xff08;Diffusion&#xff09;的高性能基座语言模型&#xff0c;拥有70亿参数规模。作为新一代语言模型的代表&#xff0c;它采用了创新的并行…...

LeaguePrank完整教程:安全修改英雄联盟段位显示的终极指南

LeaguePrank完整教程&#xff1a;安全修改英雄联盟段位显示的终极指南 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 你是否厌倦了英雄联盟客户端一成不变的段位显示&#xff1f;想要在朋友面前展示独特的个人资料页面&#…...