Is there a backend-aware load balancer for Rails/Passenger?

We have 3 Ruby on Rails applications (A, B and C) installed on a number of application servers. Our front end is HAProxy, backend is Apache + Phusion Passenger. Originally we had all 3 Rails apps installed on each application server, but this setup was slow because HAProxy "doesn't know" if a given Rails application is "hot" on a given backed server.

enter image description here

Each passenger instance is configured to run up to 8 Rails application instances.

Consider the following scenario (simplified):

  1. 8 simultaneous requests for app A come in and HAProxy dispaches all of them to the first application server, because the rest are "very busy" with other requests.
  2. Passenger starts 8 instances of the app A on this server.
  3. Another request comes in for app B, which also gets dispatched to the first application server, since other app servers are still too busy.
  4. Now Passenger has to shut down one of the instances of the app A and create one instance of app B.

In the big scheme of things when there is A TON of the requests per minute, all 3 Rails app start and stop often on each app server, which is slow.

In the perfect World applications start once and process a lot of requests without having to shut down and re-launch. That's why we had to divide our app servers between 3 Rails apps:

  • App A runs on 13 servers.
  • App B runs on 5 servers.
  • App C runs on 2 servers.

The question: is there a load balancer software that is "aware" of the backend and that knows and uses the following information to balance the load:

  • How many instances of each application each backend server currently has active/hot?
  • How many of those instances are currently processing requests?
  • What is the current average number of requests for a given application per minute/hour?
  • Is there a need to "ramp down" one application and "ramp up" another one?

The idea is to have a number of "homogenous" (same) application servers with all the apps installed, so that we could add new servers to increase the overall capacity for all apps, but the capacity for a given app is up to the "very smart" load balancer, that could control the per-app capacity without having to start and stop apps very often.


I don't know of one.

I'm facing a similar problem. At this time the best solution appears to be building a management layer that's able to track loading on the app-servers and can fiddle the load-balancer's configuration based on what it is tracking. This would be an entirely custom built solution, though, and we haven't started writing it yet.