• 请不要在回答技术问题时复制粘贴 AI 生成的内容
twogoods
V2EX  ›  程序员

一秒内的重复请求如何处理

  •  
  •   twogoods · Dec 7, 2016 · 14356 views
    This topic created in 3622 days ago, the information mentioned may be changed or developed.
    一个接口部署了三台机器, Nginx 做负载均衡,重复请求怎么处理,上 zookeeper , redis 吗?
    Supplement 1  ·  Dec 7, 2016
    业务是 insert 一条数据比如说订单这样的,重复可能就是前端点得太快造成的,所以基本就是几秒钟时间左右的幂等
    30 replies  •  2016-12-09 06:13:26 +08:00
    9hills
    9hills
    Dec 7, 2016 via iPhone
    1
    简单但是有很大局限性的方法

    负载均衡改成源地址 Hash ,保证同一来源的请求落到一个后端

    其他的都需要有个
    9hills
    9hills
    Dec 7, 2016 via iPhone
    2
    接上

    其他的基本都需要类锁服务,但是局限性也少了很多。 Redis 就不错,大部分场景也能 Hold 。
    moorlop
    moorlop
    Dec 7, 2016 via iPhone
    3
    requestID
    xjp
    xjp
    Dec 7, 2016 via iPhone
    4
    我们是用用 redis 做锁的 获取到锁的请求才正常处理 其他的请求直接返回错误
    lhbc
    lhbc
    Dec 7, 2016 via iPhone
    5
    接口所有操作都是幂等的吗?
    幂等的话多次请求并没有关系。
    mengskysama
    mengskysama
    Dec 7, 2016 via iPhone❤️2
    6
    我觉得 lz 没有表达清楚这个问题,这个请求业务逻辑是什么样的。

    如果是重复的 get 请求最高效的做法是在 nginx 上做合并回源,确保请求同一个资源只有一个请求打到后端,其他请求都要 pending 这个请求的结果
    sciooga
    sciooga
    Dec 7, 2016
    7
    关键词 惊群问题
    twogoods
    twogoods
    OP
    Dec 7, 2016
    8
    @lhbc 如果业务是 insert 一条数据,那幂等应该怎么处理?最直白就是一秒的相同请求只执行一个其他都丢弃
    phpman
    phpman
    Dec 7, 2016
    9
    重复请求有问题么?一秒内重复请求和一分钟内重复请求有什么区别呢?楼主还是要把业务逻辑表述清楚
    ihuotui
    ihuotui
    Dec 7, 2016
    10
    nginx session sticky 保持会话
    iphash 负载策略
    requestToken 过滤重复提交
    Infernalzero
    Infernalzero
    Dec 7, 2016
    11
    session 里加 token
    具体可以搜 session 重复提交
    jwdstefanie
    jwdstefanie
    Dec 7, 2016
    12
    重复提交 前台通过 ajax 提交的时候就可以过滤了 jquery 的 ajax 方法有个 gobal 属性建议看看
    honam
    honam
    Dec 7, 2016
    13
    @xjp +1 ,锁的 key 根据请求参数来定,你有什么特别的实现相互交流交流
    twogoods
    twogoods
    OP
    Dec 7, 2016
    14
    @ihuotui requestToken 过滤重复提交 能否给一个详细的思路
    tofishes
    tofishes
    Dec 7, 2016
    15
    @jwdstefanie 数据完整性、安全性等不要依赖前端,必须后端解决。
    EthanLiao
    EthanLiao
    Dec 7, 2016
    16
    @honam @xjp 具体的实现过程是怎样的,可否分享一下。
    tinyproxy
    tinyproxy
    Dec 7, 2016❤️3
    17
    hoythan
    hoythan
    PRO
    Dec 7, 2016
    18
    requestID 年月日时分秒毫秒微妙纳秒+8 位随机数。
    superrz
    superrz
    Dec 7, 2016
    20
    从前端开始处理掉这个问题吧
    amey9270
    amey9270
    Dec 7, 2016
    21
    这是一个 csrf 的问题啊
    iMouseWu
    iMouseWu
    Dec 7, 2016
    22
    赞同 @phpman 观点,这个需要看业务场景。
    如果是重试的重复请求,可以通过一个业务 /逻辑唯一 Id 来避免重复提交
    还有一种是明显按钮已经灰显了,但是用户通过自己拼的 URL 来强行提交,就把它当做一次正常请求
    ihuotui
    ihuotui
    Dec 7, 2016 via Android
    23
    @twogoods 先分析这个过程,因为网络原因,然后前端或者 app 的请求重复了,但是内容一样,所以在请求中增加一个唯一的请求码,然后后台对于记录这个用户的上一次请求码,然后对比,一样就抛弃。先分析原因,再思考解决,然后验证。
    rtx3
    rtx3
    Dec 7, 2016
    24
    请求带有状态码?能将 session 独立出去在服务器端重新取得状态吗
    rtx3
    rtx3
    Dec 7, 2016
    25
    弄错了 这个貌似要前段处理
    slixurd
    slixurd
    Dec 7, 2016❤️1
    26
    这种不都是前端控制一下就完事的事情么...
    就拿创建订单来说,这个还能加锁?
    一个正常的流程就是:用户在购物车点击下单,那么前端应该就把按钮置灰,发送请求,如果请求超时 /失败,就重置按钮状态允许重新下单.
    没听说过要在后端做这个请求的去重的...
    也没办法判断这个请求是否重复....
    ElmerZhang
    ElmerZhang
    Dec 8, 2016
    27
    前端在给后端 POST 数据之前,先到后端请求一个 uniqid , POST 数据时带上这个 uniqid ,后端对于 uniqid 相同的请求只处理一次。
    这个机制也可以用来防跨站、防刷
    KoleHank
    KoleHank
    Dec 8, 2016
    28
    前端处理下就好了, underscore 都有类似的工具类方法提供,多长时间内的只执行一次的这种
    billowqiu
    billowqiu
    Dec 8, 2016
    29
    避免重复请求,貌似只能通过请求 ID 来区分了。
    如果是前端的重复点击,那么就要保证前端每次传递同一个请求 ID ;
    如果用户不走前端页面请求,直接发 URL 改变对应的 ID ,那么只能从后端处理,后端必须验证该 ID 是否有效。
    总结:
    最保险的就是请求 ID 由后端产生,后端收到请求时验证一下 ID 是否合法,是否重复。
    hobbyliu
    hobbyliu
    Dec 9, 2016 via Android
    30
    @ElmerZhang +1 ,我们做过一个开放平台,用户下单的流程是: 1 、请求获取订单 id 接口。 2 、带上第一步的订单 id,请求下单接口,
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1725 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 14:46 · PVG 22:46 · LAX 06:46 · JFK 09:46
    ♥ Do have faith in what you're doing.