项目联调期间,遇到个bug,涉及MQ消息传递和事务提交时间问题,简单记录下。

背景

审核服务(审核创建项目),点击审核通过,后台代码会在提交事务前发送MQ消息(该消息由项目管理服务消费),发送成功后,审核通过的事务才会提交(存入数据库),该次审核记录的状态更新为审核通过。示意图如下:

项目管理服务消费申请创建项目通过的消息(上文所述MQ消息),创建对应项目名称项目。创建项目时,要求项目名未使用(已创建项目集合中无同名项目、没有审核中的申请创建同名项目流程),否则创建项目失败(报错:xxx项目名已存在)。示意图如下:

现状

预期:审核通过申请创建项目的流程,项目管理服务能够成功创建同名项目。

实际:审核通过申请创建项目的流程,项目管理服务创建同名项目失败(偶尔成功),提示项目名已存在。

分析

单用户操作,不存在并发问题,且已有项目集合中无同名项目。

审核服务用于判断“是否有审核中的创建同名项目的申请”的接口,业务实现正确。

原因:审核通过,发送MQ成功后,再进行数据库操作并提交事务。在提交事务前,项目管理服务已消费消息并发起项目名重复校验。此时对应流程还是审核中。

按常理分析,审核服务内部的事务处理速度,应该比项目管理服务接收消息&创建项目&调用审核服务校验项目名接口速度快,但是现实环境确实出现了该问题。

可能原因:

1. 项目部署环境All in one,都是在同一台机器上,包括MQ。网络延迟小。

2. 审核服务提交事务,数据库因数据量、业务逻辑、磁盘性能等等原因,导致耗时过长。

简单来说,按照原场景,在事务提交前,确实有个时间差。

解决:

临时方案 - 项目管理服务对于来自审核服务创建项目的请求,不判断是否有审核中的同名项目申请(由审核服务在申请发起时自行校验)

个人推荐 - 审核服务通过申请时,先提交数据库事务,可以根据业务设计,将申请流程置位中间状态(如审核通过(待确认创建成功))。再发送MQ消息,若MQ发送失败,重置之前那条审核流程的状态(改为审核通过创建失败,或者回滚为审核中)

反思

在强约束要求下,优先数据入库,再进行其他操作。

同时,实现功能前,需要考虑服务间时延、服务/组件不可用等情况。

【Bug】MQ消息与事务提交的更多相关文章

  1. 分布式事务解决方案(二)消息系统避免分布式事务 & MQ事务消息 & Sagas 事务模型

    参考文档: 如何用消息系统避免分布式事务:http://blog.jobbole.com/89140/ https://www.cnblogs.com/savorboard/p/distributed ...

  2. MQ(消息队列)常见的应用场景解析

    前言 提高系统性能首先考虑的是数据库的优化,之前一篇文章<数据库的使用你可能忽略了这些>中有提到过开发中,针对数据库需要注意的事项.但是数据库因为历史原因,横向扩展是一件非常复杂的工程,所 ...

  3. IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

    1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...

  4. 多维度对比5款主流分布式MQ消息队列,妈妈再也不担心我的技术选型了

    1.引言 对于即时通讯网来说,所有的技术文章和资料都在围绕即时通讯这个技术方向进行整理和分享,这一次也不例外.对于即时通讯系统(包括IM.消息推送系统等)来说,MQ消息中件间是非常常见的基础软件,但市 ...

  5. 使用Rabbit MQ消息队列

    使用Rabbit MQ消息队列 综合概述 消息队列 消息队列就是一个消息的链表,可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息 ...

  6. 几种MQ消息队列对比与消息队列之间的通信问题

    消息队列 开发语言 协议支持 设计模式 持久化支持 事务支持 负载均衡支持 功能特点 缺点 RabbitMQ Erlang AMQP,XMPP,SMTP,STOMP 代理(Broker)模式(消息在发 ...

  7. 阿里云ACE共创空间——MQ消息队列产品测试

    一.产品背景消息队列是阿里巴巴集团自主研发的专业消息中间件. 产品基于高可用分布式集群技术,提供消息订阅和发布.消息轨迹查询.定时(延时)消息.资源统计.监控报警等一系列消息云服务,是企业级互联网架构 ...

  8. 学习ActiveMQ(七):JMS消息的事务管理

    Spring提供了一个JmsTransactionManager用于对JMS ConnectionFactory做事务管理.这将允许JMS应用利用Spring的事务管理特性.JmsTransactio ...

  9. 高并发架构系列:MQ消息队列的12点核心原理总结

    消息队列已经逐渐成为分布式应用场景.内部通信.以及秒杀等高并发业务场景的核心手段,它具有低耦合.可靠投递.广播.流量控制.最终一致性 等一系列功能. 无论是 RabbitMQ.RocketMQ.Act ...

随机推荐

  1. Docker安装ES和Kibana

    1.ES安装 1.下载ES镜像问题 docker pull elasticsearch 2.运行ES docker run -it --name elasticsearch -d -p 9200:92 ...

  2. 【Java】Swagger快速入门

    Swagger 简介 Swagger 是一套基于 OpenAPI 规范构建的开源工具,可以帮助我们设计.构建.记录以及使用 Rest API.Swagger 主要包含了以下三个部分: Swagger ...

  3. 安装tensorflow2.0

    pip install tensorflow==2.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple import tensorflow as tfpri ...

  4. kubernetes核心原理之API Server原理分析

    kubernetes API Server的核心功能是提供了Kubernetes各类资源对象(Pod,RC,Service等)的增删改查及Watch等HTTP Rest接口,成为集群内各个功能模块之间 ...

  5. docker tag根据镜像id做标签,用于应用的回滚

    示例 通过ID tag镜像 下面是tag一个id为0e5574283393的本地镜像到“fedora”存储库,tag名称version1.0: docker tag 0e5574283393 fedo ...

  6. Kubernetes 控制器之 Deployment 介绍(六)

    一.Deployment.ReplicaSet.Pod之间的关系 我们接着前面的文章说,如果不清楚的请查看之前的博文:http://blog.51cto.com/wzlinux/2322616 前面我 ...

  7. 【VS开发】#pragma pack(push,1)与#pragma pack(1)的区别

    这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对 ...

  8. AVR单片机教程——数字输入

    我们已经学习了如何使用按键和拨动开关,不知你有没有好奇 button_down 和 switch_status 等函数是如何实现的.本篇教程带你一探究竟,让我们从按键的原理开始. 在原理图中,按键的符 ...

  9. IP核——RAM

    一.Quartus 1.打开Quartus ii,点击Tools---MegaWizard Plug-In Manager 2.弹出创建页面,选择Creat a new custom megafunc ...

  10. InnoDB的MVCC实现原理

    InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的. 这两个列,一个保存了行的创建时间,一个保存了行的过期时间(删除时间).当然存储的并不是实际时间,而是系统版本号(sytem ve ...