blob: e04253709c707a4b23bd0af4b78504d71aa021c8 [file] [log] [blame]
Title: Multipoint (TCP) Discovery
As TCP has no real broadcast functionality to speak of, communication of
who is in the network is achieved by each server having a physical
connection to each other server in the network.
To join the network, the server must be configured to know the address of
at least one server in the network and connect to it. When it does both
servers will exchange the full list of all the other servers each knows
about. Each server will then connect to any new servers they've just
learned about and repeat the processes with those new servers. The end
result is that everyone has a direct connection to everyone 100% of the
time, hence the made-up term "multipoint" to describe this situation of
each server having multiple point-to-point connections which create a fully
connected graph.
On the client side things are similar. It needs to know the address of at
least one server in the network and be able to connect to it. When it does
it will get the full (and dynamically maintained) list of every server in
the network. The client doesn't connect to each of those servers
immediately, but rather consults the list in the event of a failover, using
it to decide who to connect to next.
The entire process is essentially the art of using a statically maintained
list to bootstrap getting the more valuable dynamically maintained list.
# Server Configuration
In the server this list can be specified via the
`conf/multipoint.properties` file like so:
server = org.apache.openejb.server.discovery.MultipointDiscoveryAgent
bind = 127.0.0.1
port = 4212
disabled = false
initialServers = 192.168.1.20:4212, 192.168.1.30:4212, 192.168.1.40:4212
The above configuration shows the server has an `port` `4212` open for
connections by other servers for multipoint communication. The
`initialServers` list should be a comma separated list of other similar
servers on the network. Only one of the servers listed is required to be
running when this server starts up -- it is not required to list all
servers in the network.
# Client Configuration
Configuration in the client is similar, but note that EJB clients do not
participate directly in multipoint communication and do **not** connect to
the multipoint port. The server list is simply a list of the regular
`ejbd://` urls that a client normally uses to connect to a server.
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
p.put(Context.PROVIDER_URL, "failover:ejbd://192.168.1.20:4201,ejbd://192.168.1.30:4201");
InitialContext remoteContext = new InitialContext(p);
Failover can work entirely driven by the server, the client does not need
to be configured to participate. A client can connect as usual to the server.
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
p.put(Context.PROVIDER_URL, "ejbd://192.168.1.20:4201");
InitialContext remoteContext = new InitialContext(p);
If the server at `192.168.1.20:4201` supports failover, so will the client.
In this scenario the list of servers used for failover is supplied entirely
by the server at `192.168.1.20:4201`. The server could have aquired the list
via multicast or multipoint (or both), but this detail is not visible to the
client.