User provisioning and load balancing in Java application
===

I have an application that holds onto several hundred or a few thousand users (depending on machine size, this isn't fully profiled yet) subject to the requirements:

 * Each user needs to be connected to exactly one server at any given time
 * If a server crashes the users need to be picked up by other servers quickly (in < 1 minute)
 * Needs to scale
 * Servers need to be able to drop users when their load gets heavy and add more (if available) when their load is light
 * Ultimately will need to be able to dynamically add and remove servers through AWS but I think that's out of scope for this question

My question is what sorts of technologies can accomplish this.  We'll likely be putting our application on Geronimo which should help the server know when it's at capacity among other things, but I'm new enough to JAS to not have a good sense of what this can accomplish.  I could also write this into a master/slave architecture with one server responsible for divvying users, managing which users are on which servers, periodic (every 5 minutes even) backups of its state to MySQL or something, etc., but I'm almost positive this is to reinvent the wheel and there should at least be a well-known design pattern I should follow, and hopefully the libraries or technologies that implement this.  Thanks.