我知道Ruby Web应用程序使用的应用程序服务器具有工作进程的概念。例如,Unicorn在unicorn.rb
配置文件中有这个,而对于mongrel,它被称为servers
,通常设置在mongrel_cluster.yml
文件中。
关于它的两个问题:
1)每个worker
/ server
每次收到请求时,每个{{1}} / {{1}}都是Web服务器,垃圾邮件是进程/线程/光纤,如果有请求,它会阻止新请求完成还有其他的跑步吗?
2)这与应用服务器到应用服务器不同吗? (像独角兽,杂种,瘦,webrick ......)
答案 0 :(得分:2)
这与app server到app server不同。
Mongrel(至少在几年前)会有几个工作进程,你可以使用类似Apache的东西在工作进程之间进行负载平衡;每个人都会听不同的端口。并且每个mongrel worker都有自己的请求队列,因此如果apache给它一个新请求时它很忙,新请求将进入队列,直到该worker完成请求。偶尔,我们会看到一个问题,即很长的请求(生成报告)会有其他请求堆积在其后面,即使其他杂项工人不那么忙。
Unicorn有一个主进程,只需要监听一个端口或一个unix套接字,并且只使用一个请求队列。该主进程仅在工作进程可用时将请求分配给工作进程,因此我们对Mongrel的问题不是问题。如果一个工作人员花了很长时间,它就不会有专门的备份请求,它只是无法帮助处理请求的主队列,直到它完成报告或任何大请求为止是
Webrick甚至不应该被考虑,它被设计成只在开发中运行一个工人,一直在重新加载所有东西。
答案 1 :(得分:2)
脱离我的头顶,所以不要把它当成"真相"
红宝石(MRI)服务器:
独角兽,乘客和杂种都使用工人'这些是单独的进程,所有这些工作程序在启动主进程时启动,并且它们一直存在,直到主进程退出。如果你有10名工人并且他们都在处理请求,那么请求11将被阻止,等待其中一人完成。 据我所知,webrick只运行一个进程,因此请求2将被阻止,直到请求1完成瘦:我相信它会使用事件I / O'处理http,但仍然是单个进程服务器
jruby服务器:
trinidad,torquebox是多线程的并在JVM上运行
另见puma:多线程用于jruby或rubinious
答案 2 :(得分:0)
我认为GitHub在他们(陈旧但有效)的博文https://github.com/blog/517-unicorn中最能解释独角兽。
我认为它会将积压请求放入队列中。