小垃圾写的一个保证幂等性的接口,希望大家看了可以提出意见

背景介绍 这个接口的背景是这样的,tms(运输管理系统)会下发出库任务给我们的系统,我们的系统是wms(仓库管理系统),一个调度单会调用一个我们的接口一次。一个调度单里面会有很多的包件,一辆车上会有很多的调度单,一个月台(可以理解为仓库前面的停车装货的地方),一次发货会发几个月台的数据。对面是开启并发来调用我这个接口的,并发量大概一瞬间最高的时候可能会有300左右。

业务流程介绍 首先会把接收到的数据插入到接口表中(接口入参如下),headers中的每条数据都会插入一条数据

然后开启异步线程,判断传参中headerDTO承运商(vendorCode)在承运商表是否存在,不存在的话需要插入A库和B库。插入B库的时候时使用db_link,最后把集合headers中的每条数据都插入到发货头表中。

具体代码 把所有的参数校验放在最前面(因为最开始对接口的时候字段和全局返回的字段不一样,这个报错只能自己手写),校验的字段太多,截图没有截全。

幂等性校验

我这里是在数据库里面加了调度单Id(departId)的唯一索引。如果有这个这个调度单了直接返回成功。这里我理解,单个插入和批量插入应该都是可以这样做的。各位大佬如果看了觉得有问题可以提醒一下小弟。

然后开启异步线程执行后面的插入承运商和发货计划 插入承运商表,这里因为需要根据每个的订单ID去查订单,然后还要查工厂,为了省事,这里就直接在循环中国写插入的sql。

插入承运商的时候是调用的一个已经写好的存储过程

先查询有没有,没有就使用db_link两个数据库都会插入一条数据,这里db_link会非常慢,这里会导致接口超时,这也是我使用异步的原因。

接下来就是插入接口头表,因为我需要把每条数据插入的失败的原因写入到数据库的接口表中(使用attribute9和10来表示插入是否成功,以及失败的原因,方便到时候人工介入。所以我能想到的就是循环里面写sql去插入。然后通过try catch去驳货插入发货头表失败的原因然后写入到接口表中,表示这条数据插入失败,然后人工介入)

以上就是所有的流程了。我感觉这样能够满足幂等性,然后还能提高接口的效率。可能还有很多不完善的地方。希望各位比我还新手的人能够得到借鉴,然后能够比我写的好很多,我扪心自问觉得自己写的这个比较垃圾。希望能够得到各位优秀的程序员的指点。

相关推荐
染翰13 分钟前
Linux root用户安装配置Git
linux·git·后端
正在走向自律39 分钟前
金仓数据库DISTINCT优化:从全表扫描到LIMIT 1的蜕变
后端
小马爱打代码41 分钟前
Spring源码 第十二篇:Spring 全套核心原理 - 完结终章
java·后端·spring
西安邮电大学1 小时前
2026华为OD机考真题附答案-准备生日礼物
java·后端
Trouvaille ~1 小时前
【Redis篇】Hash 哈希:字段级操作与对象存储的最佳实践
数据库·redis·后端·算法·缓存·哈希算法·键值对
Rust研习社1 小时前
Nightly 前瞻:cargo-script 让 Rust 也能写脚本
后端·rust·编程语言
AskHarries1 小时前
Chrome 插件有没有机会
后端
浩风祭月1 小时前
一次诡异的 MySQL 死锁,靠 AI 分析日志十分钟定位根因
后端·ai编程
我是一颗柠檬1 小时前
【MySQL全面教学】MySQL子查询与高级查询Day7(2026年)
数据库·后端·mysql
CodePlayer竟然被占用了2 小时前
Claude Code 出安全插件了:AI 写代码的安全网,终于有人正经做了
人工智能·后端