dynos/memory/processes 究竟是如何工作的?

How exactly do dynos/memory/processes work?

对于使用过 Heroku 的任何人(以及可能之前部署到 PaaS 并有经验的任何人):

我对 Heroku 所说的“dynos”、dynos 如何处理内存以及用户如何扩展感到困惑。我读到他们将 dynos 定义为“应用程序容器”,这意味着 dyno2 无法访问 dyno1 的 memory/file 系统。理论上说得通。

The containers used at Heroku are called “dynos.” Dynos are isolated, virtualized Linux containers that are designed to execute code based on a user-specified command. (https://www.heroku.com/dynos)

此外,如果我理解正确的话,用户可以通过 heroku ps:scale web=1 等命令定义实例化的测功机或“应用程序容器”的数量。

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

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

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

谁能赐教?我是部署的初学者,但愿意 learn/understand 更多!

Is the dyno running my server on single/multiple processes?

Yes, probably:

Gunicorn forks multiple system processes within each dyno to allow a Python app to support multiple concurrent requests without requiring them to be thread-safe. In Gunicorn terminology, these are referred to as worker processes (not to be confused with Heroku worker processes, which run in their own dynos).

We recommend setting a configuration variable for this setting. Gunicorn automatically honors the WEB_CONCURRENCY environment variable, if set.

heroku config:set WEB_CONCURRENCY=3

The WEB_CONCURRENCY environment variable is automatically set by Heroku, based on the processes’ Dyno size. This feature is intended to be a sane starting point for your application. We recommend knowing the memory requirements of your processes and setting this configuration variable accordingly.

解决方案不是限制您的进程,而是修复您的应用程序。 . Instead, store data in a database or in-memory data store.

Note, this web app does save files on disk, and through each API request, I check to see if the file does exist. Because it does, this tells me that I am requesting from the same dyno.

如果您只是想检查一下您使用的是哪台测功机,没问题。但是您可能不想将实际数据保存到 dyno 的文件系统中,因为它 is ephemeral. You'll lose all changes made to the filesystem whenever your dyno restarts. This happens frequently(每天至少一次)。