幂等

当涉及业务数据的变更,不是简单的数据查询时, 在调用方相同条件有效重复请求时,就需要保持业务系统数据之间的一致性,不管请求多少次都会返回相同的结果。

比如一个订单支付接口,第一次请求返回支付成功,即使后面的请求没有实际的支付行为,也应该返回查询到的支付成功的结果。如果拦截并抛出异常,就可能造成一端支付失败,一端支付成功的情况;如果第一次返回支付失败,就不需要幂等,因为支付失败在该业务场景下是无效的。

如何确定是相同的请求重复发送,就需要调用方带上一个请求的唯一标识,如订单号,数据库主键,或由数据库主键组合而成的编号,不能是每次随机生成guid。如果找不到一个有意义的唯一标识,可以在进入页面时生成一个唯一Key插入数据库,提交的时候带上该唯一Key,数据库加上唯一索引。

防并发

当客户端高频率重复请求,或者在分布式系统架构中,代理(网关)没正确分发报文,如某一节点超时没有正常响应,导致报文被分发到多个节点,且间隔时间较短,就容易产生并发问题。高级别的防重就是在防并发。

如何防重

  1. 页面限制,如限制按钮点击,强制页面刷新
  2. 代码层面数据查询判重
  3. 并发加(分布式)锁
  4. 数据库唯一约束(不能只依赖数据库,数据库重复插入抛出的异常会影响客户端的处理)

基本校验流程

与单例代码流程相似

  1. 两次数据库判重,避免每次都要获取分布式锁
  2. 将第二次数据库判重改为捕获异常DuplicateKeyException来节省数据库链接(可用AOP实现)
  3. 一次都不判重,直接捕获异常DuplicateKeyException
/*方案一*/
if(...)/*参数简单校验*/
{
return ...;
}
if (...)/*数据库判重*/
{
return ...;
}
using (var distributeLock=new ...)/*分布式锁*/
{
if (...)/*数据库二次判重*/
{
return ...;
}
//todo
}

超时

很多系统的网关,代理都会设置超时时间,过了时间链接就会自动断开,当数据量过大时,没有及时优化sql,就容易出现超时,影响正常业务流程。所以接口的性能非常重要,明确单一职责,尽量做最少,最简单的事情。

超时优化

  1. Sql调优。调试优化EF生成的sql,增加对应索引。
  2. 数据库,流,调用第三方服务等耗时较多操作改为异步方法,或开启一个新的线程。
  3. 流程由同步改为异步。如服务端只记录请求,直接返回客户端处理中,后续流程使用定时任务或消息队列处理,然后客户端进行轮询或服务端回调通知。异步流程会增加系统的复杂度,开发成本,但相对应也提高了系统的稳定性和扩展性。

Web API幂等、超时优化的更多相关文章

  1. Web Api 内部数据思考 和 利用http缓存优化 Api

    在上篇<Web Api 端点设计 与 Oauth>后,接着我们思考Web Api 的内部数据: 其他文章:<API接口安全加强设计方法> 第一  实际使用应该返回怎样的数据 ? ...

  2. Web API使用记录系列(二)HelpPage优化与WebApiTestClient

    继续使用记录的第二节,HelpPage的优化与测试工具WebApiTestClient的使用. 之前没怎么整理博客,都是记录一下笔记,真正好好整理发现没想像的那么简单.不管怎么说还是培养下写博客的习惯 ...

  3. RESTful Web API 理解

    REST 是一种应用架构风格,不是一种标准,是面向资源架构(ROA)风格,与具体技术平台无关,REST架构的应用未必建立在Web之上,与之对应的是传统的Web Service 采用的面向操作的RPC架 ...

  4. 我这么玩Web Api(二):数据验证,全局数据验证与单元测试

    目录 一.模型状态 - ModelState 二.数据注解 - Data Annotations 三.自定义数据注解 四.全局数据验证 五.单元测试   一.模型状态 - ModelState 我理解 ...

  5. Web API 入门指南 - 闲话安全

    Web API入门指南有些朋友回复问了些安全方面的问题,安全方面可以写的东西实在太多了,这里尽量围绕着Web API的安全性来展开,介绍一些安全的基本概念,常见安全隐患.相关的防御技巧以及Web AP ...

  6. 用Middleware给ASP.NET Core Web API添加自己的授权验证

    Web API,是一个能让前后端分离.解放前后端生产力的好东西.不过大部分公司应该都没能做到完全的前后端分离.API的实现方式有很 多,可以用ASP.NET Core.也可以用ASP.NET Web ...

  7. [转]用Middleware给ASP.NET Core Web API添加自己的授权验证

    本文转自:http://www.cnblogs.com/catcher1994/p/6021046.html Web API,是一个能让前后端分离.解放前后端生产力的好东西.不过大部分公司应该都没能做 ...

  8. 我所理解的RESTful Web API [Web标准篇]

    REST不是一个标准,而是一种软件应用架构风格.基于SOAP的Web服务采用RPC架构,如果说RPC是一种面向操作的架构风格,而REST则是一种面向资源的架构风格.REST是目前业界更为推崇的构建新一 ...

  9. 我所理解的RESTful Web API [设计篇]

    <我所理解的RESTful Web API [Web标准篇]>Web服务已经成为了异质系统之间的互联与集成的主要手段,在过去一段不短的时间里,Web服务几乎清一水地采用SOAP来构建.构建 ...

随机推荐

  1. 基于WEB的车票预订信息系统设计

    注册登录界面 用户输入网址以后,用自己的手机号作为账号,然后输入自己想设置的密码注册一个号,然后点击注册,即注册登录.如图5.1所示: 图5.1 车票预订信息系统注册登录界面 5.2  车票查询界面 ...

  2. VSCode部署JAVA项目出现The type java.lang.Object cannot be resolved

    如题,出现的原因是这样的:我将mac系统上的eclipse项目复制到了ubuntu环境下,通过vscode的远程功能连接ubuntu. 然后项目上就出现了各种报错,显示The type java.la ...

  3. Thymeleaf的基本用法

    俗话说,不会前端的后端工程师不是一个合格的程序员.因为在项目中经常要和前端工程师打交道,并且偶尔也会涉及前端的简单开发,因此在闲暇之余学习了一点前端的知识,今天首先总结归纳一下 Thymeleaf 模 ...

  4. PAT (Basic Level) Practice (中文)1087 有多少不同的值 (20 分) (set)

    当自然数 n 依次取 1.2.3.…….N 时,算式 ⌊ 有多少个不同的值?(注:⌊ 为取整函数,表示不超过 x 的最大自然数,即 x 的整数部分.) 输入格式: 输入给出一个正整数 N(2). 输出 ...

  5. Linux的文件、目录权限管理

    查看文件夹的详细信息 [root@s25linux ~]# ll /tmp总用量 4drwxr-xr-x. 2 root root   6 2月 17 11:00 hehe   #文件夹 解读它的信息 ...

  6. 实现字符串和从0到n-1范围内的数字串的一一对应---->poj1200

    #include<iostream> using namespace std; ; int num[maxn]; string s; int main() { int nc;//字符串s中 ...

  7. Java内置锁的简单认识

    多线程开发离不开锁机制,现在的Java语言中,提供了2种锁,一种是语言特性提供的内置锁,还有一种是 java.util.concurrent.locks 包中的锁,这篇文章简单整理一下内置锁的知识点. ...

  8. thinkphp3.2短信群发项目实例

    项目功能是企业给客户群发短信,我就写这么多,也不知道你能不能运行成功,如果有问题可以在QQ上问我:605114821 项目文件SMS_V2.zip下载地址,百度云:http://yun.baidu.c ...

  9. mysql建立索引类型及索引建立的原则

    索引类型:Unique(唯一索引,一般为主键),Normal(一般索引,普通字段,可做组合索引),索引方法:BTREE 1.选择唯一性索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录 ...

  10. POJ 1099 Square Ice 连蒙带猜+根据样例找规律

    目录 题面 思路 思路 AC代码 题面 Square Ice Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4526   A ...