项目联调期间,遇到个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. Mac 上ssh远程连接Linux服务器提示Host key verification failed.

    当我们对重装远程服务器的时候会出现Host key verification failed问题 解决办法: rm -rf ~/.ssh/known_hosts 重新ssh连接,OK!

  2. c++11 为什么使用ref,和引用的区别

    std::ref只是尝试模拟引用传递,并不能真正变成引用,在非模板情况下,std::ref根本没法实现引用传递,只有模板自动推导类型时,ref能用包装类型reference_wrapper来代替原本会 ...

  3. [LeetCode] 639. Decode Ways II 解码方法 II

    A message containing letters from A-Z is being encoded to numbers using the following mapping way: ' ...

  4. 【SSH进阶之路】Spring的IOC逐层深入——源码解析之IoC的根本BeanFactory(五)

    我们前面的三篇博文,简单易懂的介绍了为什么要使用IOC[实例讲解](二).和Spring的IOC原理[通俗解释](三)以及依赖注入的两种常用实现类型(四),这些都是刚开始学习Spring IoC容器时 ...

  5. pcl使用入门

    最近在学习pcl,C++早就忘记了,所以踩了好些坑 不过终于通过了,特此记录下来 环境:win7+pcl1.81+vs2015 1.安装pcl1.81 下载PCL-1.8.1-AllInOne-msv ...

  6. php实用功能小记

    1.任意数目的参数 function fun(){ $args = func_get_args(); foreach ($args as $k => $v) { echo "arg&q ...

  7. SpringBoot常用注解(三)

    最全的Java常用开发注解 转   https://blog.csdn.net/weixin_40753536/article/details/81285046              Spring ...

  8. string 与 int double 的转化

    #include <iostream> #include <string> #include <sstream> using namespace std; int ...

  9. Spring Cloud初认识

    一.MicroService基本描述 微服务(MicroService)架构产生的原因:解决单体应用框架的缺点. 单体应用(Monolith)框架:所有的代码及功能都包含在一个WAR包中的项目组织方式 ...

  10. AVR单片机教程——按键动作

    上一篇教程中我们学习了如何读取按键状态.而按键的动作,比如单击,至少需要两个状态才能判定,长按.双击的判定更加复杂.今天我们来学习如何使用库函数判断按键单击,以及其实现原理. 我们要实现的是:当一个按 ...