如何解决dynos/内存/进程究竟是如何工作的?
对于任何使用过 Heroku 的人(可能还有其他任何曾经部署到 PaaS 并有经验的人):
我对 Heroku 所说的“dynos”是什么意思、dynos 如何处理内存以及用户如何扩展感到困惑。我读到他们将dynos定义为“应用程序容器”,这意味着dyno2无法访问dyno1的内存/文件系统。理论上有道理。
Heroku 使用的容器称为“dynos”。 Dynos 是隔离的虚拟化 Linux 容器,旨在根据用户指定的命令执行代码。 (https://www.heroku.com/dynos)
此外,如果我理解正确,用户可以通过 heroku ps:scale web=1
等命令来定义实例化的 dynos 或“应用容器”数量。
我最近创建了一个 web 应用程序(一个 Flask/gunicorn 应用程序,如果这很重要的话),我在其中声明了一个变量来跟踪有多少用户访问了某条路线(我知道,这不是最好的方法,但无论如何都无关紧要) .在本地测试中,它似乎工作正常(即使对于多个客户端)
当我部署到 Heroku 时,只有一个 Web dyno (heroku ps:scale web=1
),我发现情况并非如此,而且该变量似乎有多个实例,并且以不同方式更新。我知道内存不会在不同的测功机之间共享,但我只有一个运行服务器的测功机。所以我认为这个变量/网络应用程序应该只有一个实例? dyno 是否在单个/多个进程上运行我的服务器?如果是这样,我该如何限制?
请注意,此 Web 应用确实将文件保存在磁盘上,并且通过每个 API 请求,我会检查该文件是否确实存在。因为确实如此,这告诉我我正在从同一个测功机请求。
也许有人可以启发我?我是部署的初学者,但愿意学习/了解更多!
解决方法
dyno 是否在单个/多个进程上运行我的服务器?
Gunicorn 在每个 dyno 中分叉多个系统进程,以允许 Python 应用程序支持多个并发请求,而不要求它们是线程安全的。在 Gunicorn 术语中,这些被称为工作进程(不要与 Heroku 工作进程混淆,后者在自己的 dynos 中运行)。
我们建议为此设置设置一个配置变量。 Gunicorn 会自动遵守 WEB_CONCURRENCY 环境变量(如果已设置)。
heroku config:set WEB_CONCURRENCY=3
WEB_CONCURRENCY
环境变量由 Heroku 根据进程的 Dyno 大小自动设置。此功能旨在成为您的应用程序的合理起点。我们建议您了解进程的内存要求并相应地设置此配置变量。
解决方案不是限制您的流程,而是修复您的应用程序。 Global variables shouldn't be used to store data across processes。而是将数据存储在 a database or in-memory data store 中。
请注意,此 Web 应用确实将文件保存在磁盘上,并且通过每个 API 请求,我会检查该文件是否确实存在。因为确实如此,这告诉我我正在从同一个测功机请求。
如果您只是想检查您使用的是哪个测功机,那很好。但是您可能不想将实际数据保存到 dyno 的文件系统中,因为它is ephemeral。每当您的 dyno 重新启动时,您将丢失对文件系统所做的所有更改。此 happens frequently(每天至少一次)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。