基本上,我运行的是一个Flask服务器,它处理大量数据并将其发送回用户。我们并不期望有多少用户~60,但我注意到并发可能会有什么问题。现在,如果我打开一个选项卡并发送一个请求来进行数据处理,我们的应用程序就需要30多个。
如果我打开另一个选项卡,同时发送相同的请求,独角兽将同时完成它,如果我们有两个分开的用户进行两个单独的请求,这是很好的。但是,如果有一个用户打开4或8个选项卡并发送相同的请求,会发生什么情况呢?它为其他人备份服务器,是否可以告诉Gunicorn一次只接受来自同一个IP?的一个请求?
发布于 2020-02-04 19:50:52
对于@jon的答案,一个更好的解决方案是限制web服务器而不是应用服务器的访问。一种很好的方法是在应用程序的不同层执行的职责之间进行分离。理想情况下,应用服务器、烧瓶不应该对限制进行任何配置,也不应该从请求的来源进行任何配置。web服务器,在本例中,nginx的职责是根据某些参数将请求路由到正确的客户端。限制应在这一层进行。
现在,进入限制,您可以在nginx的http块配置中使用limit_req_zone指令来完成它。
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
server {
...
location / {
limit_req zone=one burst=5;
proxy_pass ...
}其中,binary_remote_addr是客户端的IP,允许平均每秒不超过1个请求,脉冲串不超过5个请求。
支持提示:,因为来自同一个IP的后续请求将被保存在一个队列中,因此nginx超时的可能性很大。因此,最好有一个更好的proxy_read_timeout,如果报告需要更长的时间,那么也可以调整gunicorn的超时时间。
limit_req_zone文档
nginx发表的关于速率限制的博客文章可以找到这里。
发布于 2020-02-03 16:19:19
这可能不是最好的处理在烧瓶的水平。但是如果你必须在那里做,那么事实证明,其他人已经设计了一个烧瓶插件来做这个:
https://flask-limiter.readthedocs.io/en/stable/
如果一个请求至少需要30几个,那么每隔30分钟对一个请求的地址进行限制。这将解决不耐烦的用户疯狂点击而不是等待一个非常长的过程完成的问题。
这并不是你所要求的,因为它意味着更长/更短的请求可能重叠,同时允许多个请求,这并不完全排除您描述的多个选项卡的行为等等。也就是说,如果您能够告诉您的用户等待30秒的任何事情,听起来就像你在司机座位上设定用户对用户的期望。如果您可以构建异步服务器交互,那么一条好的等待/进度消息可能也会有所帮助。
https://stackoverflow.com/questions/60041374
复制相似问题