热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

MQ分布式环境下保持数据一致性

业务场景:支付宝的余额系统与蚂蚁金服的余额宝是两个对立的平台,相互之间通过ActiveMQ进行通信。当用户把1000块钱从余额存进余额宝的时候,余额系统数据库减1000,然后发送一

业务场景:

支付宝的余额系统与蚂蚁金服的余额宝是两个对立的平台,相互之间通过ActiveMQ进行通信。当用户把1000块钱从余额存进余额宝的时候,余额系统数据库减1000,然后发送一个消息到MQ,余额宝端接收到这个消息后,在其数据库中加1000.

《MQ分布式环境下保持数据一致性》

可能存在的问题:

1. 消息丢失问题。用户发起1000块钱的转账,支付宝余额平台减了1000,触发消息放到了队列,余额宝端成功消费了消息,但是在修改数据库的时候发生了异常,进行了回滚。这时候消息就丢失了。

解决办法,支付宝余额端要有消息重发机制。当余额宝端接受到消息之后,更新完数据库之后,要回调支付宝平台的接口,告诉支付宝我这里操作成功完成了。如果长时间没有回调,则支付宝端应该察觉到问题才可以。我们可以在支付宝余额端建立一个账本,记录每一次的操作。这个账本就是历史订单表。创建一个订单历史表,message_id用来定义每一次操作,并且会将这个值放到消息队列中。status字段用于标记余额宝端是否成功回调了告诉了支付宝这次操作是否成功。字段值为confirmed或者unconfirmed.

《MQ分布式环境下保持数据一致性》

余额宝端有一个job在一直监视着订单历史表,如果发现有记录一直处于unconfirm状态,会再次发一个相同的消息给余额宝端。这样就避免了消息丢失问题。

《MQ分布式环境下保持数据一致性》

 

2. 这样会引发新的问题,重复消费问题。余额宝端成功消费了消息,成功更新了数据库,都是由于网络原因回调失败,那么支付宝端会再次发出一个MQ,这样如果余额宝端再次消费,那么就成了增加2次1000块。解决办法,可以在余额宝端也加一个账本,记录历史记录。这个表中包含message_id,每次成功更新数据库之后,就在这个表中加入一条记录。那么第二次同一个消息过来的时候,因为是用一个message_id,那么就会被丢弃。这样,消息重复问题也就解决了。

 


推荐阅读
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • 深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用
    深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用 ... [详细]
  • 人人租机作为国内领先的信用免押租赁平台,为企业和个人提供全方位的新租赁服务。通过接入支付宝小程序功能,该平台实现了从零到百的迅猛增长,成为全国首家推出“新租赁小程序”开发服务的阿里巴巴小程序服务商(ISV)。这一创新举措不仅提升了用户体验,还显著增强了平台的市场竞争力。 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 文件系统管理与设计涉及众多内容,课堂讲解较为简略。本章主要介绍了以下几点:1. 基本概念 - 文件系统:一种用于实现数据持久性存储的系统抽象。 - 文件:文件系统中的基本存储单元,包含一组相关数据。文件系统通过文件组织和管理数据,提供高效的数据访问和管理机制。此外,还涵盖了文件的属性、类型和操作方法。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 掌握PHP框架开发与应用的核心知识点:构建高效PHP框架所需的技术与能力综述
    掌握PHP框架开发与应用的核心知识点对于构建高效PHP框架至关重要。本文综述了开发PHP框架所需的关键技术和能力,包括但不限于对PHP语言的深入理解、设计模式的应用、数据库操作、安全性措施以及性能优化等方面。对于初学者而言,熟悉主流框架如Laravel、Symfony等的实际应用场景,有助于更好地理解和掌握自定义框架开发的精髓。 ... [详细]
  • 本文深入探讨了Python线程池的内部实现机制,作为对Apshceduler调度器研究的延伸。在先前关于Apshceduler源码分析的文章中,我们提到调度器通过`def_do_submit_`函数将任务提交到线程池。本文将进一步解析线程池的工作原理,包括任务分配、线程管理及性能优化等方面,为读者提供更全面的技术理解。 ... [详细]
  • 修复一个 Bug 竟耗时两天?真的有那么复杂吗?
    修复一个 Bug 竟然耗费了两天时间?这背后究竟隐藏着怎样的复杂性?本文将深入探讨这个看似简单的 Bug 为何会如此棘手,从代码层面剖析问题根源,并分享解决过程中遇到的技术挑战和心得。 ... [详细]
  • CAS 机制下的无锁队列设计与实现 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
author-avatar
才女与尔同销万古愁
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有