【Bug】MQ消息与事务提交
项目联调期间,遇到个bug,涉及MQ消息传递和事务提交时间问题,简单记录下。
背景
审核服务(审核创建项目),点击审核通过,后台代码会在提交事务前发送MQ消息(该消息由项目管理服务消费),发送成功后,审核通过的事务才会提交(存入数据库),该次审核记录的状态更新为审核通过。示意图如下:
项目管理服务消费申请创建项目通过的消息(上文所述MQ消息),创建对应项目名称项目。创建项目时,要求项目名未使用(已创建项目集合中无同名项目、没有审核中的申请创建同名项目流程),否则创建项目失败(报错:xxx项目名已存在)。示意图如下:
现状
预期:审核通过申请创建项目的流程,项目管理服务能够成功创建同名项目。
实际:审核通过申请创建项目的流程,项目管理服务创建同名项目失败(偶尔成功),提示项目名已存在。
分析
单用户操作,不存在并发问题,且已有项目集合中无同名项目。
审核服务用于判断“是否有审核中的创建同名项目的申请”的接口,业务实现正确。
原因:审核通过,发送MQ成功后,再进行数据库操作并提交事务。在提交事务前,项目管理服务已消费消息并发起项目名重复校验。此时对应流程还是审核中。
按常理分析,审核服务内部的事务处理速度,应该比项目管理服务接收消息&创建项目&调用审核服务校验项目名接口速度快,但是现实环境确实出现了该问题。
可能原因:
1. 项目部署环境All in one,都是在同一台机器上,包括MQ。网络延迟小。
2. 审核服务提交事务,数据库因数据量、业务逻辑、磁盘性能等等原因,导致耗时过长。
简单来说,按照原场景,在事务提交前,确实有个时间差。
解决:
临时方案 - 项目管理服务对于来自审核服务创建项目的请求,不判断是否有审核中的同名项目申请(由审核服务在申请发起时自行校验)
个人推荐 - 审核服务通过申请时,先提交数据库事务,可以根据业务设计,将申请流程置位中间状态(如审核通过(待确认创建成功))。再发送MQ消息,若MQ发送失败,重置之前那条审核流程的状态(改为审核通过创建失败,或者回滚为审核中)
反思
在强约束要求下,优先数据入库,再进行其他操作。
同时,实现功能前,需要考虑服务间时延、服务/组件不可用等情况。
【Bug】MQ消息与事务提交的更多相关文章
- 分布式事务解决方案(二)消息系统避免分布式事务 & MQ事务消息 & Sagas 事务模型
参考文档: 如何用消息系统避免分布式事务:http://blog.jobbole.com/89140/ https://www.cnblogs.com/savorboard/p/distributed ...
- MQ(消息队列)常见的应用场景解析
前言 提高系统性能首先考虑的是数据库的优化,之前一篇文章<数据库的使用你可能忽略了这些>中有提到过开发中,针对数据库需要注意的事项.但是数据库因为历史原因,横向扩展是一件非常复杂的工程,所 ...
- IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列
1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...
- 多维度对比5款主流分布式MQ消息队列,妈妈再也不担心我的技术选型了
1.引言 对于即时通讯网来说,所有的技术文章和资料都在围绕即时通讯这个技术方向进行整理和分享,这一次也不例外.对于即时通讯系统(包括IM.消息推送系统等)来说,MQ消息中件间是非常常见的基础软件,但市 ...
- 使用Rabbit MQ消息队列
使用Rabbit MQ消息队列 综合概述 消息队列 消息队列就是一个消息的链表,可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息 ...
- 几种MQ消息队列对比与消息队列之间的通信问题
消息队列 开发语言 协议支持 设计模式 持久化支持 事务支持 负载均衡支持 功能特点 缺点 RabbitMQ Erlang AMQP,XMPP,SMTP,STOMP 代理(Broker)模式(消息在发 ...
- 阿里云ACE共创空间——MQ消息队列产品测试
一.产品背景消息队列是阿里巴巴集团自主研发的专业消息中间件. 产品基于高可用分布式集群技术,提供消息订阅和发布.消息轨迹查询.定时(延时)消息.资源统计.监控报警等一系列消息云服务,是企业级互联网架构 ...
- 学习ActiveMQ(七):JMS消息的事务管理
Spring提供了一个JmsTransactionManager用于对JMS ConnectionFactory做事务管理.这将允许JMS应用利用Spring的事务管理特性.JmsTransactio ...
- 高并发架构系列:MQ消息队列的12点核心原理总结
消息队列已经逐渐成为分布式应用场景.内部通信.以及秒杀等高并发业务场景的核心手段,它具有低耦合.可靠投递.广播.流量控制.最终一致性 等一系列功能. 无论是 RabbitMQ.RocketMQ.Act ...
随机推荐
- python离线包下载地址
https://pypi.org/project/pdfconv/ https://pypi.org/search/?q=major&o=
- electron---表单验证问题
使用elementui进行表单提交数据的时候,经常会需要用到表单验证的功能,下面就来说说这个功能. <template> <div> <el-form :model=&q ...
- 微信公众号开发系统入门教程(公众号注册、开发环境搭建、access_token管理、Demo实现、natapp外网穿透)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/a1786223749/article/ ...
- latex怎样生成table字样和caption换行的表格
\begin{table} \caption{\newline The results of running algorithm parallel using MapReduce.} \hline ...
- django-rest-framework 使用例子
Start Your API 创建项目 startproject rest_api 创建APP startapp task 配置 rest_api/settings.py INSTALLED_APPS ...
- 【神经网络与深度学习】【计算机视觉】SSD
SSD 转自:https://zhuanlan.zhihu.com/p/24954433?refer=xiaoleimlnote 参考: SSD: Single Shot MultiBox Detec ...
- vscode添加vue文件模板
文件->首选项->用户代码片段->输入vue,打开vue.json 添加模板json "Print to console": { "prefix&quo ...
- 没有索引导致的DIRECT PATH READ
5月20号下午4-5点,某项目组进行数据入库作业,作业人员反映入库速度很慢.在16:30和16:50分别采集了快照,并根据两个快照得到AWR报告. 直接看TOP 5 EVENTS,这是数据库问题诊断的 ...
- AOP实现事务和记录日志
AOP (Aspect Oriented Programming) 将非功能性需求从功能性需求中剥离出来,解耦并且解决代码复用的问题,比如说权限控制,事务控制,记录操作日志,全局捕获异常等 @Aspe ...
- (一)线性表(linear list)
文章目录 定义 特点 ADT (abstract data type) 定义 摘抄自 维基百科 线性表(英语:Linear List)是由 n(n≥0)个 数据元素(结点)a[0],a[1],a[2] ...