MultiPulse is an alternative multicast lookup that does not use a regular heartbeat. Instead, servers listen for a multicast request packet (a pulse) to which a response is then sent. Multicast network traffic is effectively reduced to an absolute minimum.
MultiPulse is only useful in network scenarios where both client and server can be configured to send multicast UDP packets.
After you boot the server for the first time the default configuration will create the
file conf/conf.d/multipulse.properties
containing:
server = org.apache.openejb.server.discovery.MulticastPulseAgent
bind = 239.255.2.3
port = 6142
disabled = true
group = default
You just need to enable the agent by setting disabled = false
. It is advisable to
disable multicast in the multicast.properties file
, or at least to use a different
bind address or port should you wish to use both.
All of the above settings except server
can be modified as required.
The port
and bind
must be valid for general multicast/udp network communication.
The group
setting can be changed to further group/cluster servers that may use
the same multicast channel. As shown below the client also has an optional group
setting which can be used to select an appropriate server cluster from the multicast
channel (See MultiPulse Client).
The next step is to ensure that the advertised services are configured for discovery.
Edit the ejbd.properties
file (and any other enabled services such as http, etc.) and
ensure that the discovery
option is set to a value that remote clients will be able
to resolve.
server = org.apache.openejb.server.ejbd.EjbServer
bind = 0.0.0.0
port = 4201
disabled = false
threads = 20
discovery = ejb:ejbd://{bind}:{port}
NOTE: If either 0.0.0.0
(IPv4) or [::]
(IPv6) wildcard bind addresses are used then the
server will actually broadcast all of it's known public hosts to clients. Clients will then
cycle though and attempt to connect to the provided hosts until successful.
If localhost
is used then only clients on the same physical machine will actually 'see' the
server response.
The multipulse 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 multipulse://
URL can be used in the InitialContext
properties to
signify that multipulse 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, "multipulse://239.255.2.3:6142?group=default&timeout=250");
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 multipulse 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.
Note that clients do not need to use multipulse 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.