首页 > 解决方案 > 为什么我的 Flask 后端在 Heroku 上不稳定?

问题描述

我为游戏创建了一个小型后端 API。当用户创建游戏(对 API 的请求完成)时,Python 会创建该游戏的新实例(更准确地说,我在 dict 中添加游戏)。用户在响应中获取游戏 id 并且现在可以玩(前端调用多个路由来更新此游戏的状态)。

它在本地完美运行,但在 Heroku 上非常不稳定:我使用轮询,大约 50% 的请求失败,因为找不到游戏 ID。

我无法弄清楚为什么后端有时会找到游戏而有时却找不到。

有人知道出了什么问题吗?

非常感谢。

标签: flaskheroku

解决方案


这听起来可能是由于您实现内存存储的方式。如果它不是线程安全的,则应用程序可能在开发中完全工作,但是当使用 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)。


推荐阅读