如何对Ajax请求进行速率限制?

4

我的用户界面目前是完全开放的。

特别地,有一些元素,每个元素都可以被用户单独删除。如果用户重复点击删除按钮,将会不断触发ajax请求。

限制访问速率是一个标准做法吗?我是否应该实施这样的措施,或者允许用户完全开放访问呢?


也许可以加一个“全部删除”按钮,以避免用户连续点击该按钮。 - Ryan Endacott
当快速连续点击按钮时,可能会同时访问相同的记录,这可能会导致数据库出错。 - tymeJV
首先弄清楚到底发生了什么。请求没有完成吗?如果一个ajax请求没有完成,你应该先尝试记录错误日志。 - JohnP
听起来你在客户端和服务器之间建立的协议不是“线程安全”的,因此多个并行请求会使其出现问题。如果是这样,你应该让每个请求完全独立于其他可能正在进行的任何事情。无论是速率限制还是更大的服务器都不能解决可能根本上存在的错误。 - Jon
2个回答

3
你可以将用户请求分组放入队列中。然后,定期检查该队列是否有新请求需要发送。 因此,用户界面将追加要执行的操作,您将能够控制发送它们的频率。如果该操作已经在队列中,则可以防止追加操作。 此外,这种方式还可以修改代码以接受要执行的操作列表。
这是一个通用描述,可使用JavaScript函数(如setTimeout)实现。

2
首先,这个问题有一部分是客户端问题,另一部分是服务器问题。一些标准解决方案包括:
  • 调整界面,不允许用户过于频繁地提交某些操作(例如,使用JS禁用重复提交请求),
  • 通常情况下不需要在服务器上实现速率限制,但这也可能会有所帮助,
以StackOverflow为例:当你踩了一个答案之后,就不能再次踩它;当你提交评论时,需要在每次提交之间等待几秒钟。
至于错误方面...你可能会遇到以下几类问题之一。例如:
  • 连接问题(缺乏连接、不稳定的连接或非常缓慢的连接),
  • 内部客户端限制(例如,同时发出的请求数量已达到最大允许值),
  • 其他服务器端限制(速率限制、请求相互阻塞等)。

1
因为这是不良行为,所以SO会这样做,以防止您进行投票垃圾邮件。如果他们让您垃圾邮件,也不会有技术问题。 - Jon
@Jon:我认为这正是最初的想法。但不要低估多次重复请求的威力。如果有很多“狂热”的用户,他们可能会将网站推向容量的边缘。 - Tadeck
@pure_code.mom:我更倾向于禁用已经请求删除的项目的删除按钮(例如,您已经点击了帖子旁边的删除按钮,因此在收到服务器响应之前隐藏该按钮)。 - Tadeck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接