Given that JavaServer Faces is inherently stateful on the server side, what methods are recommended for horizontally scaling a JSF 2.0 application?

If an application runs multiple JSF servers, I can imagine the following scenarios:

  1. Sticky Sessions: send all requests matching a given session to the same server.
    • Question: what technology is commonly used to achieve this?
    • Problem: server failure results in lost sessions... and generally seems like fragile architecture, especially when starting fresh (not trying to scale an existing application)
  2. State (Session) Replication: replicate JSF state on all JSF servers in cluster
    • Question: what technology is commonly used to achieve this?
    • Problem: does not scale. total memory of cluster = total memory on smallest server
  3. Instruct JSF (via configuration) to store its state on an external resource (e.g. another server running a very fast in-memory database), then access that resource from the JSF servers when application state is needed?
    • Question: is this possible?
  4. Instruct JSF (via configuration) to be stateless?
    • Question: is this possible?

[EDIT]

Updated in response to Ravi's suggestion of Sticky Sessions

Edit
Report