首页 > 其他分享 >【IT老齐020】接口幂等性

【IT老齐020】接口幂等性

时间:2023-05-05 23:44:41浏览次数:30  
标签:网关 请求 幂等表 过期 redis 接口 老齐 020 id

【IT老齐020】接口幂等性

1683295249659

传统方案

业务代码增加前置判断

if(数据未更新){
	更新数据
}

缺点

  • 判断因素过多
  • 技术问题干扰业务代码

通用方案

幂等表

架构方案 nginx+lua+redis

  • 请求经过nginx转发到redis,redis查找幂等表是否存在请求id(uuid或请求hash)对应的key
    • 幂等表不存在请求id
      • lua脚本保存到幂等表并设置请求状态(PROC)及存活时间
      • 处理请求,处理结束后更新幂等表请求状态(OK)(无论请求结果如何)并返回结果
    • 幂等表存在请求id
      • 直接返回201,前台自动排除

使用自定义注解,利用@AOP After通知,更新Redis状态

1683295837742

1683296142153

1683296221272

过期时间作用

  • redis占用内存,幂等表数据过多,会导致系统响应变慢。设置过期时间使数据总量处于低水位
  • 服务处理未即使更新redis幂等表。设置过期时间使请求重新可用

优点

  • 后台服务无代码侵入,无需修改业务逻辑

缺点

  • 前台应用要针对幂等进行改造
  • 架构复杂度增加,需要额外部署Nginx、Redis

拓展

  • 数据量大的接口保证幂等?
    • 首先大多数幂等有效期不需要很长时间,在业务允许的前提下可以考虑缩短过期时间,其次数据量大是不怕的,怕是在数据间的耦合太大导致服务无法水平扩展,只要能保证扩展,qps就能打下来
  • 如果应用系统发出一个新请求,应用网关成功将requestId存入redis,而此时网关向数据服务转发请求时失败。在key失效前应用系统的重试机制是不是不管用了?网关转发请求到数据服务,网关自身有重试吗?
    • 网关不做重试否则幂等就被破坏了。 由网关转发失败导致的情况确实有,极少数不考虑
  • 区分那些url请求是要幂等处理呢?
    • 查询的接口可以在请求的时候不带requestId,网关判断没有id就不存redis,切面判断没有id就不去该redis
  • 加在nginx去处理会增加复杂度,直接用redis分布式锁不是也可以实现么?为什么不用redis分布式锁呢?这里nginx去redis进行nx操作,实际上也是分布式锁的一种实现
    • 降低服务端的负荷,让无效的请求不要穿透到服务端处理。
  • 后端发生错误时,redis一直会保持proc,retry的请求进不来,而redis的过期又必须覆盖retry的最大尝试时间,不然在极端情况下最后的retry还是会被错误的处理。如何解决?
    • 在后端程序发生了非逻辑错误的时候,比如依赖的其他组件或服务发生错误时,必须去处理redis中数据的状态或删除,以保证后续的retry请求能进来。

标签:网关,请求,幂等表,过期,redis,接口,老齐,020,id
From: https://www.cnblogs.com/faetbwac/p/17375707.html

相关文章

  • [ACTF新生赛2020]usualCrypt 1
    日常查壳:32位,运行看看:(有点嚣张,但不多),任意输入退出。进IDA看主函数:进入主函数后,首先是读入一个字符串,然后是对该字符串进行sub_401080方法加密,最后是对比。那么我们跟进方法,看看是什么加密类型:第一眼下去还多了一个方法sub_401000(),跟进看看:不多说,检查这两的内存:可以......
  • Go笔记(十二):接口
    1、接口的声明Go语言中的接口是一种新的类型定义,拥有将具有共性的方法定义在一起的特性。任何其他类型只要实现了这些方法就是实现了这个接口。语法详情如下:/*定义接口*/typeinterface_nameinterface{method_name1[return_type]method_name2[return_type]......
  • 小D-新版接口自动化教程- http 请求 Requests 实战
     #-*-coding:UTF-8-*-importrequestsresponse=requests.get("https://www.baidu.com")print(response.text)......
  • string为接口的注意事项
    string为接口的注意事项问题描述​在一个应用程序中用到了另外一个库的dll,向dll的接口传递std::string参数时报错。由于这方面的问题比较多,所以我进行了深入研究。前置知识在vs项目右键->属性->C/C++->代码生成->运行库,有四个选项,/MD、/MDd、/MT、/MTd含有D的选项......
  • [WUSTCTF2020]level2 1
    查壳:32位,有个小壳,怎么办,脱了呗,还能这么办(方法见前文)https://www.cnblogs.com/TFOREVERY/p/17366210.html脱壳后,进入IDA找主函数:脸上就是flag{Just_upx_-d}收工。......
  • [MRCTF2020]Transform 1
    查壳:64位,先看看运行有问题吗:任意输入给你弹了一个wrong进IDA看看:解释:输入一个字符串,要满足字符串的长度为33,不然就报错。接下来是在输入的字符串中拿出特定的字符,进行异或后得到一个新的字符串,最后与特定的字符串对比。这样看来,我们先看要对比的字符串:还不短,但是我们只......
  • 2020ICPC南京J
    以前没写过势能线段树,然后错了114514个地方,我有罪。#include<bits/stdc++.h>usingnamespacestd;constintN=200013;inta[N];structsegtree{#definemid((l+r)>>1)#definelsx<<1,l,mid#definersx<<1|1,mid+1,r#definelctr[x<<1]#definerct......
  • collection接口
    Collection接口和常用方法collection接口包含:list和set两个接口而list里有Vector类,ArrayList类和LinkedList类set里有:Hashset类和Treeset类collection接口实现类的特点collection类实现子类可以存放多个元素,每个元素可以是Object有些Collection的实现类,可以存放重复的元素......
  • MASA MinimalAPI源码解析:为什么我们只写了一个app.MapGet,却生成了三个接口
    源码解析:为什么我们只写了一个app.MapGet,却生成了三个接口1.ServiceBase1.AutoMapRoute源码如下:AutoMapRoute自动创建map路由,MinimalAPI会根据service中的方法,创建对应的api接口。比如上文的一个方法:publicasyncTask<WeatherForecast[]>PostWeather(){re......
  • api接口怎么用?
    ​ API接口是一种应用程序编程接口,它允许不同的软件应用程序之间进行通信和交互。通过使用API接口,开发人员可以轻松地将自己的应用程序集成到其他应用程序中,从而实现更丰富的功能和更好的用户体验。 API接口的使用方法一般包括以下几个步骤:首先,开发人员需要了解API接口的文档......