flask - 为什么我的 Flask 后端在 Heroku 上不稳定?
问题描述
我为游戏创建了一个小型后端 API。当用户创建游戏(对 API 的请求完成)时,Python 会创建该游戏的新实例(更准确地说,我在 dict 中添加游戏)。用户在响应中获取游戏 id 并且现在可以玩(前端调用多个路由来更新此游戏的状态)。
它在本地完美运行,但在 Heroku 上非常不稳定:我使用轮询,大约 50% 的请求失败,因为找不到游戏 ID。
我无法弄清楚为什么后端有时会找到游戏而有时却找不到。
有人知道出了什么问题吗?
非常感谢。
解决方案
这听起来可能是由于您实现内存存储的方式。如果它不是线程安全的,则应用程序可能在开发中完全工作,但是当使用 WSGI 服务器部署时,例如gunicorn
使用多个工作进程/线程,每个工作进程/线程都有自己的内存,它可能会导致你所描述的奇怪行为。
更重要的是,Heroku 很古怪。
这是gunicorn --help
安装在任何旧系统上时的输出,如果未提供标志,则pip
默认为 1 个工作人员:-w
-w INT, --workers INT
The number of worker processes for handling requests. [1]
但是,当通过 Heroku 控制台执行时,请注意它默认为 2:
-w INT, --workers INT
The number of worker processes for handling requests. [2]
Heroku 似乎出于某种原因定制了他们的 gunicorn 构建(编辑:想出了如何),因此以下 Procfile 与 2 个工作人员一起启动:
web: gunicorn some:app
而在非 Heroku 系统上,这将由单个工作人员启动。
您可能会发现以下内容Procfile
可以解决您的问题:
web: gunicorn --workers 1 some:app
当然,如果它是一个不需要扩展到多个工人的小项目,这是合适的。为了缓解此问题并扩展应用程序,您可能需要调查更改代码以在您的应用程序中实现单独的存储后端(例如 Redis)。
推荐阅读
- dockerfile - 如何使 Dockerfile COPY 适用于 Windows 绝对路径?
- php - PHP:单击所有删除复选框时,不会删除来自ajax的项目
- excel - Excel - 检查单元格是否有重复值,它以跨工作表的字母开头
- r - 在 R 中更改 plotly lasso selected 属性
- freertos - FreeRTOS xQueueSelectFromSet 卡在完整队列上
- python - 将多个参数传递给python中重试的retry_on_exception参数
- flutter - 当我运行颤振医生时,我遇到了两个错误
- javascript - Firestore:无法按降序对查询进行分页
- ssl - influxdb 1.8 中的石墨协议 TLS 支持
- javascript - 使用 Javascript 在动态添加删除行中计算行值和列值