关于重复提交的问题

2022-11-10 03:08:16 +08:00
 iam

请教大家一个问题

最近在做一个项目,接口使用了腾讯云函数,昨天发现前端会有重复提交的问题。尤其是在插入性质的接口,因为上一次请求还没完成,数据库并没有数据,重复的判断不会生效,会造成多次插入的 bug ;有没有什么好的解决方案,Redis 锁、数据库锁或者网关限制那种更好一点呢。
3031 次点击
所在节点    程序员
29 条回复
lmshl
2022-11-10 12:18:09 +08:00
前端生成资源 UUID ,重复提交始终更新同一个 UUID ,不就幂等了么?
qrobot
2022-11-11 11:30:31 +08:00
@ragnaroks 我跟你讲一下 throttle 也就是节流, 指的是在指定的间隔中指执行一次. 你说了,我可能在这方面没有经验.

请回答我两个问题


1. throttle 间隔时间多少合适?
2. throttle 会导致当前队列中所有的消息都处理完毕之后才能执行, 在特定的情况下, 我希望立即执行此函数应该怎么办?
3. 如果请求在 throttle 间隔时间中失效了, 我是否要等待 throttle 间隔结束?

当你回答了我的这三个问题, 请问 `throttle 从来不是"非常错误的行为"` 你还保持此观念吗?

你可以看我的 github 里面的所有方案, 我从来不会采用 throttle ,这种方式进行所谓防止多次触发.



在回答你之后的一个问题, 如果在 在没有异步完成端口之前,F5 就能刷死服务器, 很显然, 这个服务器的后端代码存在严重的问题, 前端的防止多次点击, 本质来说是为了给客户进行一个良好的视觉反馈, 而并不是为了保证请求到后端的接口一定就是一次.

因为恶意用户完全可以通过其他方式进行多次发送请求.
qrobot
2022-11-11 11:36:28 +08:00
@ragnaroks 你可以在 Google, Facebook, Github 等产品中去学习一下, 看看在防止多次点击的情况下, 他们是否会使用 throttle 做优化处理, 或则你看在好的虚拟滚动的解决方案中, 是否经常采用 throttle 来作为解决方案, 确实 throttle 很方便, 但是我认为它并不是好的解决方案, 我甚至认为, 这在某种场景下, 是一个滥用的行为(非常错误的行为)
qrobot
2022-11-11 11:44:09 +08:00
一个请求大概会有 发送(send), 接受(receive), 重试(retry), 这三个阶段, 在 throttle 中并不是很优雅的对这三个阶段中进行很好的操作
ragnaroks
2022-11-11 11:54:06 +08:00
@qrobot

什么叫"在回答你之后的一个问题"?除了这我这当前的楼层,我在这个贴子还提出过问题?

throttle 什么时候变成了"指的是在指定的间隔中指执行一次"?
你规定的?
有没有可能,throttle 指的是一种处理事务的方式而且这个时候连浏览器都没被发明?

你的 1 、2 、3 基于的假定就是错的,看来你完全无法理解 throttle ,但我还是按你的思路来解答你的疑问。

1:事务开始直到事务结束
2:throttle 只针对单个事务,throttle 不会导致当前队列中所有的消息都处理完毕之后才能执行,但可能导致事务无限期运行
3:请求失效(超时)、请求成功、请求错误都是事务结束的一种( return ),所以不存在需要等待 throttle 间隔的问题,但如果未设置超时时间则可能无限期执行此请求

综上所述,throttle 唯一的缺陷在于没有被正确结束时会导致事务无限期运行,形成一个阻塞( block )的效果。但这是人的问题,不是 throttle 的问题。我依然保持 throttle 从来不是"非常错误的行为"的正确观念。

我其实很不理解,throttle 是一种处理问题的方式,为什么一定要被你限定到前端上的 `const handler = throttle(callback)`?

用户点击按钮触发事件,代码将按钮替换为 loading 组件,fetch 请求返回然后代码将 loading 组件替换为按钮,这个流程就是 throttle ,你一边诋毁 throttle ("首先 throttle 是一件非常错误的行为") 又一边赞美 throttle ("按钮上的 loading 或者 按钮上的 禁用 都是一个非常好的方案") 确实挺有意思的。

最后提醒你一下,HTTPd 是 Apache ,一个古老的 HTTP 服务端应用程序,我不知道怎么就和后端扯上关系了。throttle 最开始还有一个在事务处理方面的同义词叫 backlog 。

我通常很少发布长篇大论在论坛上,因为驱逐劣币的活一般轮不到我。
ragnaroks
2022-11-11 11:56:38 +08:00
给楼主点了个感谢并加了收藏,很少有这样精彩的贴子用于在各种群里面当历史必修一了。
qrobot
2022-11-11 13:51:30 +08:00
@ragnaroks 因为长期在前端工作中, 我把 throttle 局限为 lodash.throttle 这样的方法, 这非常抱歉.
ragnaroks
2022-11-11 14:38:08 +08:00
@qrobot
根据 /t/894109 的说法,是我说话的方式有问题,我不知道是否这个原因导致你的误解或局限。我可能有个“我知道,所以我认为你也应该知道”的先入为主的问题。

如果是这样那我在这里真诚的向你说对不起。

不过我是不会改的。。。
iam
2022-12-06 10:18:32 +08:00
看来我沉了 24 天!!!

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

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

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

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

© 2021 V2EX