`
guazi
  • 浏览: 54495 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

MQ消息太快导致的异步数据查询问题

    博客分类:
  • java
阅读更多
先说问题:系统用到mq发送消息,实际运行时发现mq的接收端程序在接收到消息之后,去查询业务数据的状态时发现仍然是老的状态,导致程序处理数据异常;手动去数据查询时发现是新的状态。
经分析,应该是mqserver和应用在同一个机器,mq消息太快,导致接收端程序查询时,发送端程序的数据库事务还没有提交完成,所以查询到的结果是老的数据。
如果你想思考一下,那就先暂停
-----------------------以下是解决方案------------------------------------------------------
解决方案:最初的方案是接收端延迟执行,拿到消息后 sleep1s,然后再执行,但是这是个很不好的处理,因为1s这个时间对发送端程序来说是不确定的,有可能1s是不够用的,那就用2s,3s?真不是一个好方案,但是勉强能用。
方案改进:后来又再次遇到了同样的问题,于是思考了一番,如下改进步骤:
改进1:既然与事务有关,那能不能把消息发送放在事务提交后?
实现:程序调用mq代理接口发送消息时并不真正的发送消息,而是把消息存储在ThreadLocal中,系统采用的是 springboot的事务管理:DataSourceTransactionManager,实现自定义MyDataSourceTransactionManager 继承 DataSourceTransactionManager,重写 doCommit 方法,在调用完父类的doCommit之后,查看 ThreadLocal中是否有消息,有的话就调用真正的mq发送接口发送消息;重写doCleanupAfterCompletion 方法,调用父类的doCleanupAfterCompletion 后,清理ThreadLocal中的消息。
问题:有的消息发送可能和事务无关,或者发送消息的线程中没有事务,这样就会导致消息没有真正发送
改进2:既然有没有事务的,那是不是可以在程序调用mq代理接口时查询当前线程是否有正在进行的事务,如果有,就存储消息到ThreadLocal,如果没有,就直接发送
实现:可通过 DataSourceTransactionManager.isExistingTransaction来实现
 
问题:在有事务的情况下,事务提交时发送消息,会不会影响到事务的提交?mq发送消息是网络调用,会不会影响程序的效率?
改进3,自己想把
0
0
分享到:
评论

相关推荐

    [重要]基于Websphere MQ持久化消息实现异步转同步—方案一

    - 异步通信:请求发送后不等待响应,提高并发处理能力,但可能导致数据一致性问题。 - 同步通信:请求发送后必须等待响应,保证数据的一致性,但可能会降低系统性能。 3. **持久化消息实现同步**: - 使用...

    [重要]基于Websphere MQ持久化消息实现异步转同步—方案二

    标题中的“基于Websphere MQ持久化消息实现异步转同步—方案二”是指在分布式系统中,通过使用Websphere MQ(WebSphere Message Broker,一种消息中间件)来处理异步通信,并通过消息的持久化特性,确保消息在异常...

    MQ消息测试工具 可直接向MQ写消息

    在IT行业中,消息队列(Message Queue,简称MQ)是一种重要的中间件技术,它主要用于不同系统、服务或应用之间的异步通信。MQ消息测试工具在软件开发和维护中扮演着关键角色,允许开发者验证和调试MQ消息的发送与...

    IBM WebSphere MQ消息持久化

    在IBM WebSphere MQ中,消息持久化是一个重要的特性,它确保了当队列管理器发生异常时,消息数据的安全性和一致性。以下是对IBM WebSphere MQ消息持久化相关知识点的详细说明。 首先,消息持久化是指消息的可靠性...

    MQ 消息推送

    【MQ消息推送】是分布式系统中一种常见的通信方式,它允许应用程序之间通过中间件进行异步数据传输。在本项目中,我们模仿了RabbitMQ实现了一个消息推送机制。RabbitMQ是一个开源的消息代理和队列服务器,它基于AMQP...

    mq消息头详细介绍

    MQ消息头,即MQMD(Message Descriptor),是IBM的WebSphere MQ(Message Queuing)系统中每个消息都携带的重要元数据。MQMD包含了一系列字段,用于描述消息的各种属性,帮助MQ系统正确处理和路由消息。以下是对这些...

    C# 实现消息的收发IBM WebSphere MQ 队列

    在IT行业中,消息传递系统是企业级应用的关键组成部分,它允许不同系统之间的异步通信,确保数据的可靠传输。IBM WebSphere MQ(以前称为WebSphere Message Broker)是此类系统的一个杰出代表,它提供了高可用性、可...

    利用MQ实现分布式应用系统间数据传输.pdf

    这种异步通信模式可以避免因网络延迟或系统繁忙导致的数据丢失或阻塞。 **MQ部署结构**:在分布式系统中,每个应用系统需要配置专用的传输服务器,安装MQ Server和接口软件。数据传输由专门的程序负责,从应用...

    IBM—MQ消息分组与分段实验

    例如,如果消息分组不当,可能会导致数据处理的混乱;而如果不正确处理消息分段,可能会影响大数据传输的效率和完整性。因此,进行这样的实验有助于开发者更好地理解和掌握IBM MQ的核心功能,提升他们在实际项目中的...

    C# 实现消息的收发IBM WebSphere MQ 消息队列

    IBM WebSphere MQ是IBM公司提供的一个跨平台的消息队列系统,它允许不同的应用程序和系统之间通过网络交换数据。这种技术的核心概念是消息队列,它将消息存储在队列中,直到它们被消费或过期。这种异步通信模式能够...

    C#注册MQ消息队列

    在IT领域,尤其是在分布式系统与微服务架构中,消息队列(Message Queue,简称MQ)作为重要的异步通信机制,其应用广泛且深入。本文将深入解析如何利用C#语言来实现与MQ消息队列的注册及通信过程,具体探讨的知识点...

    MQ消息队列

    本文将深入探讨MQ消息队列的核心概念、工作原理、应用场景以及常见问题,以期提供全面而深入的理解。 一、MQ消息队列基础 1.1 概念理解 MQ消息队列是一种基于发布/订阅模式或点对点模式的消息传递机制,它允许应用...

    [重要]基于Websphere MQ非持久化消息实现异步转同步

    【标题】基于Websphere MQ非持久化消息实现异步转同步 在分布式系统中,异步处理常常被用于提高系统的响应速度和处理能力。Websphere MQ(WebSphere Message Broker,简称WMQ)是IBM提供的一种高效、可靠的中间件,...

    mq消息中间件.rar

    在这个“mq消息中间件.rar”压缩包中,我们主要探讨的是RabbitMQ的核心API、高级特性、与Spring家族的整合、高可靠集群构建以及如何采用SET化架构设计和组件设计思路。 1. **RabbitMQ核心API** - **创建连接...

    电商异步消息系统的实践

    在电商异步消息系统中,消息队列(Message Queue, MQ)和消息代理(Message Broker)是核心组件。MQ存储待处理的消息,而消息代理负责接收、路由和分发消息。例如,RabbitMQ、Kafka 和 ActiveMQ 是常见的消息代理。 ...

    Delphi向MQ远程队列发送消息

    IBM WebSphere MQ,作为业界广泛使用的消息中间件,提供可靠的消息传递服务,确保数据在分布式系统中的安全传输。本篇文章将深入探讨如何使用古老的编程语言Delphi 7与IBM WebSphere MQ集成,实现向远程消息队列发送...

    MQ消息序号Message Sequence详解

    MQ是一种用于分布式系统间进行消息传递的中间件,它能够实现消息的异步传输、持久存储以及可靠交付。在MQ中,消息序号起着至关重要的作用,它不仅帮助系统追踪消息的状态,还确保了消息处理的顺序性。 #### 消息...

    IBMMQ消息序号-顺序

    IBM Message Queue (简称MQ) 是一种消息中间件技术,用于在分布式应用程序之间传递数据。MQ中的消息序号(Message Sequence Number)是一项重要的机制,用于确保消息在传输过程中不会丢失也不会重复发送。具体来说: ...

    基于Go实现的分布式MQ消息队列

    - **MQ异步通信**:采用消息队列的方式可以有效降低服务间的耦合度。各服务只需要关注与消息队列的交互,而不需要关心其他服务的状态。这种方式不仅提高了系统的响应速度,还增强了系统的容错能力。 #### 三、常见...

Global site tag (gtag.js) - Google Analytics