blob: 3257b5972823b69173928930a61d8b91dedde66c [file] [log] [blame]
Title: Multicast (UDP) Discovery
Multicast is the preferred way to broadcast the heartbeat on the network.
The simple technique of broadcasting a non-changing service URI on the
network has specific advantages to multicast. The URI itself is
essentially stateless and there is no "i'm alive" URI or an "i'm dead" URI.
In this way the issues with UDP being unordered and unreliable melt away as
state is no longer a concern and packet sizes are always small.
Complicated libraries that ride atop UDP and attempt to offer reliability
(retransmission) and ordering on UDP can be avoided. As well the
advantages UDP has over TCP are retained as there are no java layers
attempting to force UDP communication to be more TCP-like. The simple
design means UDP/Multicast is only used for discovery and from there on out
critical information is transmitted over TCP/IP which is obviously going to
do a better job at ensuring reliability and ordering.
# Server Configuration
When you boot the server there should be a `conf/multicast.properties` file
containing:
server = org.apache.openejb.server.discovery.MulticastDiscoveryAgent
bind = 239.255.2.3
port = 6142
disabled = true
group = default
Just need to enable that by setting `disabled=false`. All of the above
settings except `server` can be changed. The `port` and `bind` must
be valid for general multicast/udp network communication.
The `group` setting can be changed to further group servers that may use
the same multicast channel. As shown below the client also has a `group`
setting which can be used to select an appropriate server from the
multicast channel.
# Multicast Client
The multicast functionality is not just for servers to find each other in a
cluster, it can also be used for EJB clients to discover a server. A
special `multicast://` URL can be used in the `InitialContext` properties to
signify that multicast should be used to seed the connection process. Such
as:
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.openejb.client.RemoteInitialContextFactory");
p.put(Context.PROVIDER_URL, "multicast://239.255.2.3:6142?group=default");
InitialContext remoteContext = new InitialContext(p);
The URL has optional query parameters such as `schemes` and `group` and
`timeout` which allow you to zero in on a particular type of service of a
particular cluster group as well as set how long you are willing to wait in
the discovery process till finally giving up. The first matching service
that it sees "flowing" around on the UDP stream is the one it picks and
sticks to for that and subsequent requests, ensuring UDP is only used when
there are no other servers to talk to.
Note that EJB clients do not need to use multicast to find a server. If
the client knows the URL of a server in the cluster, it may use it and
connect directly to that server, at which point that server will share the
full list of its peers.
# Multicast Servers with TCP Clients
Note that clients do not need to use multicast to communicate with servers.
Servers can use multicast to discover each other, but clients are still
free to connect to servers in the network using the server's TCP address.
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
p.put(Context.PROVIDER_URL, "ejbd://192.168.1.30:4201");
InitialContext remoteContext = new InitialContext(p);
When the client connects, the server will send the URLs of all the servers
in the group and failover will take place normally.