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

概述

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

public void updateProductInfo(Product product) {
  //1、将商品价格更新到价格系统
  priceService.updatePrice(product);
  //2、将库存信息更新库存系统
  stockService.updateStock(product);
  //3、将商品更新到本地数据库
  productService.updateProduct(product);
}

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

  • 1、调用价格系统、库存系统的操作以及保存数据到本地DB都正常;
  • 2、调用价格系统接口的时候就抛异常了;
  • 3、调用价格系统接口正常,但是调用库存系统的接口有异常;
  • 4、调用价格系统和库存系统的接口都正常了,但是将商品数据更新到本地数据库出现异常。

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

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

重试和操作日志

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

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

库存接口允许重试

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

库存接口不允许重试

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

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

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

总结

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

(0)

相关推荐

  • PHP调用微博接口实现微博登录的方法示例

    在平时项目开发过程中,除了注册本网站账号进行登录之外,还可以调用第三方接口进行登录网站.这里以微博登录为例.微博登录包括身份认证.用户关系以及内容传播.允许用户使用微博帐号登录访问第三方网站,分享内容,同步信息. 1.首先需要引导需要授权的用户到如下地址: https://api.weibo.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRE

  • 易语言调用接口来实现机器人聊天的功能

    常量数据表 .版本 2 .常量 常量1, "<文本长度: 41>", , AI [现行时间]: Hi俺寂寞空虚冷 陪陪俺吧 .常量 常量2, "<文本长度: 25>", , 我 [现行时间]: [内容] .常量 常量3, "<文本长度: 24>", , AI [现行时间]: [内容] .常量 常量4, "<文本长度: 8>", , "text":"

  • Java 调用Restful API接口的几种方式(HTTPS)

    摘要:最近有一个需求,为客户提供一些Restful API 接口,QA使用postman进行测试,但是postman的测试接口与java调用的相似但并不相同,于是想自己写一个程序去测试Restful API接口,由于使用的是HTTPS,所以还要考虑到对于HTTPS的处理.由于我也是首次使用Java调用restful接口,所以还要研究一番,自然也是查阅了一些资料. 分析:这个问题与模块之间的调用不同,比如我有两个模块front end 和back end,front end提供前台展示,back

  • HttpClient实现调用外部项目接口工具类的示例

    实例如下: import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.http.NameValuePair; import org.apache.http.HttpEntity; import org.apache.http.client.config.RequestConfi

  • vue.js中引入vuex储存接口数据及调用的详细流程

    前言 前几天在慕课网上看到黄轶老师的高仿饿了么app视频教程,在做接口设计的时候,我在想,这个接口能不能储存下来全局调用呢?而不是走很多次接口,管理起来也麻烦. 万能的vue果然有这个功能,那就是vuex. Vuex 是一个主要应用在中大型单页应用的类似于 Flux 的数据管理架构.它主要帮我们更好地组织代码,以及把应用内的的状态保持在可维护.可理解的状态. 如果你不太理解 Vue.js 应用里的状态是什么意思的话,你可以想象一下你此前写的 Vue 组件里面的 data 字段.Vuex 把状态分

  • C#接口在派生类和外部类中的调用方法示例

    本文实例讲述了C#接口在派生类和外部类中的调用方法.分享给大家供大家参考,具体如下: C#的接口通过interface关键字进行创建,在接口中可以包含属性,方法等成员变量.接口的派生类可以对接口中的方法进行实现.一个类可以继承多个接口对这些接口中的方法进行实现,一个接口也可以派生多个类接口中的方法可以由这些类中的一个或多个进行实现.在接口的派生类中可以直接调用接口中的方法. 在派生类中调用举例: //接口 public interface IPersonalService { //接口中的方法

  • PHP中如何防止外部恶意提交调用ajax接口

    我们自己网站写好的ajax接口,如果给自己用,那就限定一下来路域名,判断一下来路即可. 注意:将www.jb51.net替换成你自己的域名. 复制代码 代码如下: //判断来路 if(!isset($_SERVER['HTTP_REFERER']) || !stripos($_SERVER['HTTP_REFERER'],'www.jb51.net')) {  echo 'cann`t access';  exit(); }

  • java实现腾讯ocr图片识别接口调用

    最近开发了一个拍车牌识别车牌号的功能,主要调用了腾讯的ocr车牌识别接口,直接上代码: 首先生成签名以及读取配置的工具类: package com.weaver.formmodel.integration.ocr; import java.util.Random; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import weaver.general.Base64; public class SignUtil

  • C#支付宝新版支付请求接口调用

    本文实例为大家分享了C#支付宝新版支付请求接口调用的具体代码,供大家参考,具体内容如下 因为支付宝已经集成了完整的SDK,所以可以使用SDK直接调用API,这里获取SDK源码. 首先我们需要引用支付宝SDK集成 AopSdk.dll. 添加相关引用: using Aop.Api; using Aop.Api.Domain; using Aop.Api.Request; using Aop.Api.Response; 需要用到商户私钥,支付宝公钥,请求地址等公共参数,所以可以新建一个config文

  • Python调用C++,通过Pybind11制作Python接口

    我是在ubuntu系统进行实验的,所以和window可能会有区别. python调用C/C++有不少的方法,如boost.python, swig, ctypes, pybind11等,这些方法有繁有简,而pybind11的优点是对C++ 11支持很好,API比较简单,现在我们就简单记下Pybind11的入门操作. 1. pybind11简介与环境安装 pybind11是一个轻量级的只包含头文件的库,它主要是用来在已有的 C++代码的基础上做扩展,它的语法和目标非常像Boost.Python,但

  • Vue2 配置 Axios api 接口调用文件的方法

    前情回顾 在上一篇中,我们通过配置基本的信息,已经让我们的项目能够正常的跑起来了.但是,这里还没有涉及到 AJAX 请求接口的内容. vue 本身是不支持 ajax 接口请求的,所以我们需要安装一个接口请求的 npm 包,来使我们的项目拥有这个功能. 这其实是一个重要的 unix 思想,就是一个工具只做好一件事情,你需要额外的功能的时候,则需要安装对应的软件来执行.如果你以前是一个 jquery 重度用户,那么可能理解这个思想一定要深入的理解. 支持 ajax 的工具有很多.一开始,我使用的是

  • 解决angularjs前后端分离调用接口传递中文时中文乱码的问题

    1.首先前端需要进行字符串加密两次 encodeURIComponent(encodeURIComponent(param)); 2.这里是以java后台为例需要进行一次解码 URLDecoder.decode("接受到的String类型参数","UTF-8") 示例如下: @RequestMapping("looked_list") public Map lookedList(@RequestParam Map map) throws Unsu

  • 易语言调用接口查看QQ各项资料的代码

    DLL命令表 .版本 2 .DLL命令 ShellExecuteA, 整数型, "shell32.dll", "ShellExecuteA", , 查找与指定文件关联在一起的程序的文件名,并执行相关操作,成功则返一个大于31的值. .参数 hwnd, 整数型, , 用来指定被执行文件显示的窗口所属的父窗口句柄,可以为NULL .参数 lpOperation, 文本型, , 指向一个表示执行方式的字符串 .参数 lpFile, 文本型, , 用来指定文件名,文件名既可

随机推荐