Title: EJB Client/Server Failover

OpenEJB supports stateless failover.  Specifically, the ability for an EJB
client to failover from one server to the next if a request cannot be
completed.  No application state information is communicated between the
servers, so this functionality should be used only with applications that
are inherently stateless.  A common term for this sort of setup is a server
farm.

The basic design assumption is that all servers in the same group have the
same applications deployed and are capable of doing the same job.  Servers
can be brought online and offline while clients are running.  As members
join/leave this information is sent to the client as part of normal EJB
request/response communication so active clients always have the most
current information on servers that can process their request should
communication with a particular server fail.

# Client Behavior

On each request to the server, the client will send the version number
associated with the list of servers in the cluster it is aware of. 
Initially this version will be zero and the list will be empty.  Only when
the server sees the client has an old list will the server send the updated
list.  This is an important distinction as the list is not transmitted back
and forth on every request, only on change.  If the membership of the
cluster is stable there is essentially no clustering overhead to the
protocol -- 8 byte overhead to each request and 1 byte on each response --
so you will *not* see an exponential slowdown in response times the more
members are added to the cluster.  This new list takes affect for all
proxies that share the same connection.

When a server shuts down, more connections are refused, existing
connections not in mid-request are closed, any remaining connections are
closed immediately after completion of the request in progress and clients
can failover gracefully to the next server in the list.  If a server
crashes requests are retried on the next server in the list (or depending
on the `ConnectionStrategy`).  This failover pattern is followed until there
are no more servers in the list at which point the client attempts a final
multicast search (if it was created with a `PROVIDER_URL` starting with
`multicast://`) before abandoning the request and throwing an exception to
the caller.

By default, the failover is ordered but random selection is supported.	The
multicast discovery aspect of the client adds a nice randomness to the
selection of the first server.

# Discovery

Each discoverable service has a URI which is broadcast as a heartbeat to
other servers in the cluster.  This URI advertises the service's type, its
cluster group, and its location in the format of 'group:type:location'. 
Say for example "cluster1:ejb:ejbd://thehost:4201".  The URI is sent out
repeatedly in a pulse and its presence on the network indicates its
availability and its absence indicates the service is no longer available.

The sending of this pulse (the heartbeat) can be done via UDP or TCP:
multicast and "multipoint" respectively.  More on that in the following
section.  The rate at which the heartbeat is pulsed to the network can be
specified via the 'heart_rate' property.  The default is 500 milliseconds. 
This rate is also used when listening for services on the network.  If a
service goes missing for the duration of 'heart_rate' multiplied by
'max_missed_heartbeats', then the service is considered dead.

The 'group' property, cluster1 in the example, is used to dissect the
servers on the network into smaller logical clusters.  A given server will
broadcast all it's services with the group prefixed in the URI, as well it
will ignore any services it sees broadcast if they do not share the same
group name.

#Details

Multicast

 - [Multicast UDP Discovery](multicast-discovery.html)
 - [Multipulse UDP Discovery](multipulse-discovery.html)

Multipoint

 - [Multipoint TCP Discovery](multipoint-discovery.html)
 - [Considerations](multipoint-considerations.html)
 - [Recommendations](multipoint-recommendations.html)

Logging

 - [Failover Logging Events](failover-logging.html)



