当前位置: 首页 > news >正文

Java怎么保证数据一致性_连续调用多个外部系统写接口保证数据一致性的思路...

概述

某些场景下,我们将业务数据落地之前,是需要先调用外部系统的多个写接口,当这些写接口都操作成功了,我们才将业务数据落地到自己本地的数据库里面。比如说:

public void updateProductInfo(Product product) {

//1、将商品价格更新到价格系统

priceService.updatePrice(product);

//2、将库存信息更新库存系统

stockService.updateStock(product);

//3、将商品更新到本地数据库

productService.updateProduct(product);

}

就上面这个例子(例子是虚构的,只是为了说明问题而已),它的执行路径有几种:

1、调用价格系统、库存系统的操作以及保存数据到本地DB都正常;

2、调用价格系统接口的时候就抛异常了;

3、调用价格系统接口正常,但是调用库存系统的接口有异常;

4、调用价格系统和库存系统的接口都正常了,但是将商品数据更新到本地数据库出现异常。

如果是第一和第二这两种情况,无需考虑数据一致性问题,但是如果出现了第三和第四这两种情况,我们就得根据业务实际情况,考虑如何保证数据的一致性。

这里说的保证数据一致性,必须是由调用方来保证的,服务端是无法保证的。

重试和操作日志

以上面提到的第三种情况来说明一下。

调用价格系统接口正常,但是调用库存系统的接口有异常。

库存接口允许重试

如果库存系统接口是幂等的,那么调用方可以使用重试的机制,多调用几次,比如说3次。如果还是不成功,那之前价格系统接口的操作就得走反向操作,进行现场恢复。

库存接口不允许重试

价格系统接口的操作得走反向操作,进行现场恢复

要实现反向操作,恢复现场,有一种办法是使用分布式事务,但是实现起来实在太复杂了,性能也不好。可以尝试使用操作日志来恢复现场。比如说,价格系统调用成功了,把这个操作状态以及相关的业务数据记录起来,当库存操作失败后,利用操作日志里的数据,将之前的价格操作恢复回来。这个恢复操作,价格系统可以单独提供出一个接口。

如果恢复现场的操作也失败了,这个时候只能人工介入解决了。没其他办法了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章:

  • js多层对象数组 合并_js 将多个对象合并成一个对象 assign方法的实现
  • Linux mysql导入 表没有退出_Linux中mysql表的导出导入
  • mysql 5.7.17 jdk要求_Centos 7配置JDK1.8+MySQL5.7+Tomcat 8 开发环境
  • JAVA的error访问不存在_调用WxMpService的临时素材下载方法无效,提示错误代码:99999,文件名不存在...
  • mysql user表误删除_mysql user表root 用户误删除解决方法
  • top筛选java输出到文件_linux – 将时间戳添加到“top”命令输出
  • java城市级联代码_java json 省市级联实例代码
  • java写post 服务端_curl post请求java服务端提供的接口
  • mysql数据库model_mysql – 一个_model_数据从关系数据库在clojure?
  • Java构造函数求两点间的距离_java计算两点间的距离方法总结
  • java 关闭串口_Java串口关闭块
  • java 连接springmvc配置文件_详解SpringMVC加载配置Properties文件的几种方式
  • php 多路复用_php多路复用(多线程)
  • php autoload 原理,PHP的autoload机制的实现解析
  • php查询数量,php – 如何多个查询结果以减少查询数量?
  • 2017届校招提前批面试回顾
  • angular组件开发
  • HTML-表单
  • JavaScript设计模式与开发实践系列之策略模式
  • React的组件模式
  • Shell编程
  • springboot_database项目介绍
  • 闭包,sync使用细节
  • 理解在java “”i=i++;”所发生的事情
  • 实习面试笔记
  • 通过几道题目学习二叉搜索树
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 用Canvas画一棵二叉树
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • Semaphore
  • ​flutter 代码混淆
  • ${ }的特别功能
  • (1)常见O(n^2)排序算法解析
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (7)STL算法之交换赋值
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (第61天)多租户架构(CDB/PDB)
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (十) 初识 Docker file
  • (转)EOS中账户、钱包和密钥的关系
  • (转)memcache、redis缓存
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .apk 成为历史!
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .net refrector
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET命名规范和开发约定
  • .net实现客户区延伸至至非客户区
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .NET中的十进制浮点类型,徐汇区网站设计
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @DataRedisTest测试redis从未如此丝滑