我最近阅读了 SoundCloud Team 的一篇很棒的博文。这篇文章讨论了软件架构演进。
http://backstage.soundcloud.com/2012/08/evolution-of-soundclouds-architecture/
在“负载分配和一点队列理论”部分中,Sean Treadway 谈到了队列理论以及如何更好地使用队列。
他写了:
我们想要一个从不排队的系统,但如果它确实排队,排队的等待时间是最短的。将 M/M/c 模型发挥到极致,我们问自己“如何才能让 c 尽可能大?”</p>
为此,我们需要确保单个 Rails 应用程序服务器一次不会收到多个请求
我们将 HAProxy 添加到我们的基础架构中,将每个后端配置为最大连接数 > 1,并在所有主机上添加我们的后端进程,通过将 HTTP 请求排队到任何后端来获得美妙的 M/M/c 减少 > 驻留等待时间任何主机上的进程变为可用
显然,他们正在使用 HAProxy + Rails 服务器(可能是 Mongrel)。好的,HAProxy 对传入请求进行排队,并且仅在可用时分派给 Mogrel/Thin。
也许我完全错了;),但是 Apache + Passenger 做同样的事情,对吗?一个队列(Apache 处理传入请求)和 C Workers(子进程)