Gossip protocol is a method for a group of nodes to discover and check the liveliness of a cluster. More information can be found at http://en.wikipedia.org/wiki/Gossip_protocol.
The original implementation was forked from https://code.google.com/p/java-gossip/. Several bug fixes and changes have already been added.
To gossip you need one or more seed nodes. Seed is just a list of places to initially connect to.
GossipSettings settings = new GossipSettings();
int seedNodes = 3;
List<GossipMember> startupMembers = new ArrayList<>();
for (int i = 1; i < seedNodes+1; ++i) {
startupMembers.add(new RemoteGossipMember("127.0.0." + i, 2000, i + ""));
}
Here we start five gossip processes and check that they discover each other. (Normally these are on different hosts but here we give each process a distinct local ip.
List<GossipService> clients = new ArrayList<>();
int clusterMembers = 5;
for (int i = 1; i < clusterMembers+1; ++i) {
GossipService gossipService = new GossipService("127.0.0." + i, 2000, i + "",
LogLevel.DEBUG, startupMembers, settings, null);
clients.add(gossipService);
gossipService.start();
}
Later we can check that the nodes discover each other
Thread.sleep(10000);
for (int i = 0; i < clusterMembers; ++i) {
Assert.assertEquals(4, clients.get(i).get_gossipManager().getMemberList().size());
}
For a very simple client setup with a settings file you first need a JSON file such as:
[{
"id":"419af818-0114-4c7b-8fdb-952915335ce4",
"port":50001,
"gossip_interval":1000,
"cleanup_interval":10000,
"members":[
{"host":"127.0.0.1", "port":50000}
]
}]
where:
id
- is a unique id for this node (you can use any string, but above we use a UUID)port
- the port to use on the default adapter on the node's machinegossip_interval
- how often (in milliseconds) to gossip list of members to other node(s)cleanup_interval
- when to remove 'dead' nodes (in milliseconds)members
- initial seed nodes
Then starting a local node is as simple as:
GossipService gossipService = new GossipService(
StartupSettings.fromJSONFile( "node_settings.json" )
);
gossipService.start();
And then when all is done, shutdown with:
gossipService.shutdown();
The status can be polled using the getters that return immutable lists.
List<LocalGossipMember> getMemberList()
public List<LocalGossipMember> getDeadList()
These can be accessed from the GossipManager
on your GossipService
, e.g:
gossipService.get_gossipManager().getMemberList();
Users can also attach an event listener:
GossipService gossipService = new GossipService("127.0.0." + i, 2000, i + "", LogLevel.DEBUG,
startupMembers, settings,
new GossipListener(){
@Override
public void gossipEvent(GossipMember member, GossipState state) {
System.out.println(member+" "+ state);
}
});
You can get this software from maven central.
<dependency>
<groupId>io.teknek</groupId>
<artifactId>gossip</artifactId>
<version>${pick_the_latest_version}</version>
</dependency>