同一个dyno可以运行多个不同的进程吗?

时间:2017-03-16 14:31:27

标签: amazon-web-services heroku microservices

我对heroku架构有疑问。我正在创建运行为微服务的小应用程序(不是很多 - 大约4-6个微服务)。关键是,我想全天候提供这个应用程序,所以免费的dyno时间对我来说还不够。

我看到如果我要扩展到hobby计划,我会得到heroku所谓的10 Process Types。我的问题来了:

我可以在每个进程(web)上运行另一个微服务,或者heroku只能为每个dyno安装一个Web进程,而10 process types用于扩展我的应用程序吗?换句话说,如果我需要6个24/7运行的微服务,我应该买6个爱好dynos吗?

3 个答案:

答案 0 :(得分:5)

您只能拥有1个网络流程类型。您可以横向扩展您的Web进程以在多个dynos上运行(“水平可伸缩性”),但是您需要升级到至少标准1x dyno类型才能执行此操作(即,如果您使用的话,您只能运行1个web dyno实例免费或爱好dyno类型)。

但是,除了Web进程之外,您还可以实例化多个其他进程类型(例如“worker”进程)。这些将无法侦听来自客户端的HTTP / S请求,但可用于从Web进程中卸载长时间运行的作业。

因此,如果您将每个4-6微服务映射到Procfile中的不同进程类型,并且如果您的微服务本身不是Web服务器,那么您可能可以使用业余爱好者dynos。

答案 1 :(得分:2)

Heroku的默认模型是将流程类型映射到自己的dyno:https://devcenter.heroku.com/articles/procfile个州

  

“您的应用程序中的每个dyno都属于其中一个进程   类型,并将通过运行与之关联的命令开始执行   那个过程类型。“

e.g。 heroku ps:scale worker=1类型为worker

其他人已经写过关于how to use foremanHoncho在一个dyno中运行多个python进程的文章,这些进程在post_compile步骤中使用了辅助Procfile和可能的其他slug设置。根据您选择的语言和构建包,您可能会做类似的事情;官方buildpack API没有列出这一步:/。也就是说,鉴于Heroku的基础Ubuntu stacks,您可以使用web: script.sh来完成任何设置和执行过程。

要对Docker容器中的多个进程进行分组,您可以查看https://runnable.com/docker/rails/run-multiple-processes-in-a-container,它再次依赖于自定义CMD [ "/start.sh" ]。请注意,这与Docker的每容器单进程理念相反,并且会让您感到更头疼,例如围绕将信号转发到子进程,一个丑陋的Dockerfile来设置所有微服务等等(如果您决定使用多个容器,Heroku在using Docker Compose for local dev上有一个写入。)

此外,请不要忘记您是bounded by the performance of your dynoprocess/thread limits

当然,对于非玩具生产或长期开发维护,通常不建议给定dyno中的多个过程。 ;)

答案 2 :(得分:2)

RUNIT buildpack可以轻松地在一个dyno中组合多个进程 - 只要它们都符合您的dyno内存限制(对于Hobby dyno为512M)。

每个Heroku应用程序仍然只有一个HTTP端点,这意味着您的微服务需要通过队列,发布/订阅或某些RPC中心(如deepstream.io)进行通信。