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

2016-12-07 09:30:02 +08:00
 twogoods
一个接口部署了三台机器, Nginx 做负载均衡,重复请求怎么处理,上 zookeeper , redis 吗?
12444 次点击
所在节点    程序员
30 条回复
amey9270
2016-12-07 19:08:17 +08:00
这是一个 csrf 的问题啊
iMouseWu
2016-12-07 19:22:46 +08:00
赞同 @phpman 观点,这个需要看业务场景。
如果是重试的重复请求,可以通过一个业务 /逻辑唯一 Id 来避免重复提交
还有一种是明显按钮已经灰显了,但是用户通过自己拼的 URL 来强行提交,就把它当做一次正常请求
ihuotui
2016-12-07 20:42:05 +08:00
@twogoods 先分析这个过程,因为网络原因,然后前端或者 app 的请求重复了,但是内容一样,所以在请求中增加一个唯一的请求码,然后后台对于记录这个用户的上一次请求码,然后对比,一样就抛弃。先分析原因,再思考解决,然后验证。
rtx3
2016-12-07 21:00:39 +08:00
请求带有状态码?能将 session 独立出去在服务器端重新取得状态吗
rtx3
2016-12-07 21:02:24 +08:00
弄错了 这个貌似要前段处理
slixurd
2016-12-07 21:29:44 +08:00
这种不都是前端控制一下就完事的事情么...
就拿创建订单来说,这个还能加锁?
一个正常的流程就是:用户在购物车点击下单,那么前端应该就把按钮置灰,发送请求,如果请求超时 /失败,就重置按钮状态允许重新下单.
没听说过要在后端做这个请求的去重的...
也没办法判断这个请求是否重复....
ElmerZhang
2016-12-08 09:47:17 +08:00
前端在给后端 POST 数据之前,先到后端请求一个 uniqid , POST 数据时带上这个 uniqid ,后端对于 uniqid 相同的请求只处理一次。
这个机制也可以用来防跨站、防刷
KoleHank
2016-12-08 13:46:39 +08:00
前端处理下就好了, underscore 都有类似的工具类方法提供,多长时间内的只执行一次的这种
billowqiu
2016-12-08 23:31:50 +08:00
避免重复请求,貌似只能通过请求 ID 来区分了。
如果是前端的重复点击,那么就要保证前端每次传递同一个请求 ID ;
如果用户不走前端页面请求,直接发 URL 改变对应的 ID ,那么只能从后端处理,后端必须验证该 ID 是否有效。
总结:
最保险的就是请求 ID 由后端产生,后端收到请求时验证一下 ID 是否合法,是否重复。
hobbyliu
2016-12-09 06:13:26 +08:00
@ElmerZhang +1 ,我们做过一个开放平台,用户下单的流程是: 1 、请求获取订单 id 接口。 2 、带上第一步的订单 id,请求下单接口,

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/325814

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX