我想要一个容器处理多个请求吗?

Posted

技术标签:

【中文标题】我想要一个容器处理多个请求吗?【英文标题】:Do I want a container handling multiple requests? 【发布时间】:2015-01-07 11:30:22 【问题描述】:

这个问题与网络或托管无关,而是与我如何构建我的应用程序有关:如果我将 docker 容器设置为 php Web 节点,那么我设置它的正确约定是它可以处理多个连接?

或者,最好将其设置为一次处理一个请求,然后如果我想同时处理更多连接,则启动同一图像的多个实例?

【问题讨论】:

不明白为什么会有这么多反对票。我唯一能想到的是,你过去真的激怒了一些人。 我不打算从这里链接到它,但是这个问题最终受到了 Stack Overflow“元效应”的伤害,并且几乎关闭(我不得不努力让它保持开放) .也就是说,我认为这个问题经常出现,很难找到正确的措辞。希望随着时间的推移,错误的反对意见将被这个问题的优点所抵消。 The meta effect goes both ways. :) 确实如此。不幸的是,它也可能与首先所说的有关。一些积极或消极的东西。感谢您的精彩笔记。我投了赞成票:) 好吧,我说过我会回答这个问题,所以我回答了,现在它重新打开了。我想我解决了你提出的所有问题。 【参考方案1】:

首先,请查看docker.io 和tutorial - 在您解决具体的架构问题之前,对它们的用途有充分的了解非常重要。

现在,在 PHP 世界中,您可以在容器中运行带有 mod_php(或 nginx / php_fpm 或其他)的 Apache。该容器将为所有传入请求提供服务。

如果您需要对应用程序进行负载平衡,那么您将拥有另一个容器(可能在另一个主机上)和一个反向代理(如 HAProxy)来为您处理这个问题。您还可以将 DNS 配置为在有或没有 HAProxy 的网络服务器实例之间进行循环。

【讨论】:

这个答案值得与接受的答案一起考虑。唯一缺少的是,它没有涉及我的具体问题,即询问您是否要在主机上运行同一进程的多个实例。 投反对票,因为它根本不回答问题(容器是否应该回答多个请求),只是提供了一些关于在 docker 容器中运行 PHP 的一般信息。【参考方案2】:

如果您认为容器类似于流程,这将适当地指导您的选择。

遵循“一个应用程序到一个容器”的最佳实践建议,它是一个进程,尽管在某些控制组中附加了某些命名空间,chroot-ed。

【讨论】:

不错!好的,所以过程本身的情况 - 实际上是 - 对其使用无关紧要。所以我仍然会像通常那样对待运行进程的主机,并且对于能够处理多个连接的软件,不会尝试运行它的多个实例。 是的;您可能有理由运行多个实例,例如将它们固定到 NUMA 的不同核心,但无论是否使用 Docker,这些原因都是相同的。【参考方案3】:

Docker 容器通常用于运行单个(逻辑)应用程序并限制该应用程序使用的资源(内存、磁盘 I/O、网络带宽等)。这并不一定意味着运行单个进程。它可能具有诸如进程监视器之类的辅助功能,但通常 PHP 容器只会运行 PHP 解释器。这将运行自身的多个副本。

正如我们所知,nginx 和 php-fpm 都完全能够处理多个同时请求,直到可用资源限制。因此,单个容器可以服务多个请求。 Apache 也可以使用 mod_php,尽管在这种情况下 PHP 嵌入在 Apache 中并限制了 Apache 可以处理的内容。因此,您可能希望将 Web 服务器和 PHP 分离到单独的(链接的)容器中。

所以最终会发生的情况是,您最终会获得足够的流量,以至于单个容器无法足够快地处理所有这些,或者根本无法处理。那时,您要么想要扩大容器,要么启动一个新容器。一般来说,nginx 可以同时处理数千个请求,而 PHP 可以处理几十个(这些都是大概数字)。因此,在规模上,您可能有 800 个 PHP 容器由四个 nginx 容器提供服务,它们前面有两个 haproxy 负载均衡器容器,所有这些容器每秒处理 10,000 到 40,000 个请求。

不过,所有这 800 个 PHP 容器不一定都在 800 个主机上。如果您使用的是 t2.small AWS 实例,则可能会出现这种情况,您只需让容器使用 VM 的所有资源,但如果 IT 部署到裸机,这通常比单个资源多得多VM,您几乎可以肯定该主机上会有​​多个容器,以便利用其所有资源。 PHP 往往受 CPU 限制,因此 IT 还可能与完全不相关的容器并行运行您的容器,这些容器不使用太多 CPU,但使用大量 RAM 或磁盘。

也就是说,是的,您的单个容器可以并且将同时处理多个请求,并且您的程序应该知道这种情况正在发生。这通常不是问题,但这确实意味着您应该避免可能导致争用的问题,例如数据库锁定,或者所有您的容器可能会突然停止。

【讨论】:

以上是关于我想要一个容器处理多个请求吗?的主要内容,如果未能解决你的问题,请参考以下文章

java里面request这个东西我不启动tomcat等容器的服务,只写一个main主函数,能得到这个request吗?

Servlet容器如何同时来处理多个请求

一个分支可以打开多个拉取请求吗

Windows PHP-FPM 可以同时处理多个请求吗?

jQuery的$.ajax方法支持同时创建多个异步ajax请求吗?而且这些ajax对象必须是并行处理的

创建多个线程来处理多个请求是一种好习惯吗?