我最近读了一篇由SoundCloud Team撰写的精彩博文。文章讨论了软件架构的演变。
http://backstage.soundcloud.com/2012/08/evolution-of-soundclouds-architecture/
在“负载分配和一个小队列理论” Sean Treadway一节中,讨论了队列理论以及如何更好地使用队列。
他写道:
我们想要一个从不排队的系统,但如果它确实排队,那么等待 队列中的时间很少。将M / M / C模型推向极致, 我们问自己“我们怎样才能使c尽可能大?”
为此,我们需要确保单个Rails应用程序 服务器从未一次收到多个请求
我们将HAProxy添加到我们的基础架构中,为每个后端配置最大连接数> 1并在所有主机上添加了我们的后端进程,以便在>中实现精彩的M / M / c减少通过排队HTTP请求直到任何主机上的任何后端进程可用为止的等待时间
显然,他们正在使用HAProxy + Rails服务器(可能是Mongrel)。 好的,HAProxy会对传入的请求进行排队,只在可用时调度到Mogrel / Thin。
也许我可能完全错了;),但Apache + Passenger做同样的事情,对吧? 一个队列(Apache处理传入请求)和C Workers(子进程)
答案 0 :(得分:0)
Apache + Passenger确实将传入的请求分发到机架后端(除非请求引用静态资源,apache自己处理)。
只要一台主机可以运行所有(!)机架实例,此模型就可以正常工作。当你需要更多实例时,apache再也无法处理它了,你必须把东西放在最上面(通常是HAProxy)。但是,apache的功能远远超过仅提供基于机架的应用程序。因此,用更轻量级的东西(例如nginx)替换它是有意义的,特别是因为你为每个主机部署它一次。
我希望这有点帮助。