| = Multicast (UDP) Discovery |
| :index-group: Discovery and Failover |
| :jbake-date: 2018-12-05 |
| :jbake-type: page |
| :jbake-status: published |
| |
| |
| 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: |
| |
| [source,properties] |
| ---- |
| 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: |
| |
| [source,java] |
| ---- |
| 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. |
| |
| [source,java] |
| ---- |
| 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. |