dynos/内存/进程究竟是如何工作的



对于任何使用过Heroku的人(也许还有任何以前部署到PaaS并有经验的人(:

我对Heroku所说的";dynos";,dynos如何处理内存以及用户如何扩展。我读到他们将dynos定义为";应用程序容器";,这意味着dyno1的存储器/文件系统不能被dyno2访问。理论上是有道理的。

Heroku中使用的容器被称为"dynos"。dynos是独立的虚拟化Linux容器,旨在根据用户指定的命令执行代码。(https://www.heroku.com/dynos)

此外,用户可以定义有多少dynos,或";应用程序容器";,如果我理解正确的话,通过heroku ps:scale web=1等命令进行实例化。

我最近创建了一个网络应用程序(Flask/gunicorn应用程序,如果这很重要的话(,我在其中声明了一个变量,用来跟踪有多少用户访问了某条路线(我知道,这不是最好的方法,但无论如何都无关紧要(。在本地测试中,它似乎工作正常(即使对于多个客户端(

当我部署到只有一个web dyno(heroku ps:scale web=1(的Heroku时,我发现情况并非如此,而且该变量似乎有多个实例,并且更新方式不同。我知道不同的dyno之间不共享内存,但我只有一个运行服务器的dyno。所以我认为这个变量/web应用程序应该只有一个实例?dyno是否在单个/多个进程上运行我的服务器?如果是,我该如何限制它?

注意,这个web应用程序确实将文件保存在磁盘上,通过每个API请求,我都会检查文件是否存在。因为它确实如此,这告诉我,我正在从同一个dyno请求。

也许有人能启发我?我是部署的初学者,但愿意学习/了解更多!

dyno是否在单个/多个进程上运行我的服务器?

是的,可能是:

Gunicorn在每个dyno中分叉多个系统进程,以允许Python应用程序支持多个并发请求,而不要求它们是线程安全的。在Gunicorn术语中,这些被称为工作进程(不要与Heroku工作进程混淆,后者在自己的dynos中运行(。

我们建议为此设置设置一个配置变量。如果设置了WEB_CONCURRENCY环境变量,Gunicorn会自动接受该变量。

heroku config:set WEB_CONCURRENCY=3

WEB_CONCURRENCY环境变量由Heroku根据进程的Dyno大小自动设置。此功能旨在为您的应用程序提供一个合理的起点。我们建议您了解进程的内存需求,并相应地设置此配置变量。

解决方案不是限制您的流程,而是修复您的应用程序。全局变量不应用于跨流程存储数据。相反,将数据存储在数据库或内存数据存储中。

注意,这个web应用程序确实将文件保存在磁盘上,通过每个API请求,我都会检查文件是否存在。因为它确实如此,这告诉我,我正在从同一个dyno请求。

如果你只是想检查你使用的是哪个dyno,那就好了。但您可能不想将实际数据保存到dyno的文件系统中,因为它是短暂的。每当dyno重新启动时,您将丢失对文件系统所做的所有更改。这种情况经常发生(每天至少一次(。

最新更新