Azure WebApp部署Flask应用Scale Out后并发请求串行处理问题咨询
Azure WebApp部署Flask多实例仍串行处理请求的原因及解决方案
1. 浏览器同域名请求的队头阻塞
你用两个Edge标签页同时发起请求的测试方式本身存在限制:Chromium内核的浏览器(包括Edge、Chrome)默认会对同域名的相同GET请求做串行排队限制,第一个请求未返回时不会发起第二个,请求根本没同时到达Azure服务端,自然日志呈现串行结果。
验证方法:同时打开两个命令行终端,同时执行
curl 你的WebApp域名/test,观察日志输出即可排除该问题。
2. Azure App Service默认开启ARR会话粘性
Azure WebApp默认开启了ARR Affinity(会话粘性),该配置会把同一客户端IP的所有请求都调度到同一个实例上,你的两个请求都被转发到了同一个实例,没有用到第二个实例资源。
解决方法:进入Azure Portal对应WebApp的「配置」-「常规设置」页面,关闭「ARR 关联性」开关即可。
3. 使用了Flask默认的单线程开发服务器
Flask自带的app.run()启动的开发服务器是单线程单进程模式,单实例同一时间只能处理1个请求,哪怕请求被调度到同一个实例,也会串行执行。该服务器仅用于本地开发,不能用于生产部署。
解决方法:部署时使用生产级WSGI服务器替代Flask自带服务器,比如Gunicorn:
启动命令参考:gunicorn --workers=2 --threads=4 app:app
该配置会启动2个进程、每个进程4个线程,单实例即可处理并发请求,配合多实例负载均衡效果更好。
内容的提问来源于stack exchange,提问作者percentum
相关产品推荐
相关产品推荐

