本文主要研究一下Election Algorithms
Election Algorithms大致有两类,一类是Garcia-Molina提出的Bully Election,一类是Chang & Roberts's Token Ring Election algorithm;对于大多数的election algorithms通常有如下几个假定:
这里采用distributedLeaderElection的实现
public void onMessage(String message) {
String messageHeader = message.split(":")[0];
String messageBody = message.split(":")[1];
if (messageHeader.equals("Election")){
if (Integer.parseInt(messageBody.trim()) < Node.getMyID() // If we are a better candidate
&& !participant){
System.out.println("I " + Node.getMyID() + " am a better candidate than "+messageBody);
Node.sendMsgToNextNode("Election" + ":" + Node.getMyID()); // Suggest us for election
}
else if (Integer.parseInt(messageBody.trim()) == Node.getMyID()) { // If this is our ID
System.out.println("I " + Node.getMyID() + " received my own pebble, so I am the new leader");
Node.sendMsgToNextNode("Leader" + ":" + Node.getMyID()); // Announce us as the new leader
}
else { // The current candidate is better
System.out.println("I " + Node.getMyID() + " am a worse candidate than "+messageBody);
Node.sendMsgToNextNode(message); // Forward his candidancy
}
participant = true;
}
else if (messageHeader.equals("Leader")){
System.out.println(messageBody + " is the new leader");
leaderID = messageBody;
if (Integer.parseInt(messageBody.trim()) != Node.getMyID()) Node.sendMsgToNextNode(message);
}
}
public void onMessage(String message) {
String messageHeader = message.split(":")[0];
List<String> messageBody = Arrays.asList(message.replace(messageHeader+":", "").split(":"));
if (messageHeader.equals("Election")){
if (!messageBody.contains(Node.getMyID()+"")){ // If we are not contained in the list
System.out.println("I " + Node.getMyID() + " am not contained in this message "+message);
Node.sendMsgToNextNode(message + ":" + Node.getMyID()); // Suggest us for election
}
else { // If we are in the list
System.out.println("I " + Node.getMyID() + " am contained in this message");
String newLeader = findLeaderInBody(messageBody);
Node.sendMsgToNextNode("Leader" + ":" + newLeader); // Announce the new leader
}
}
else if (messageHeader.equals("Leader")){
String leaderBody = message.split(":")[1];
System.out.println(leaderBody + " is the new leader");
leaderID = leaderBody;
if (Integer.parseInt(leaderBody.trim()) != Node.getMyID()) Node.sendMsgToNextNode(message);
}
}
private String findLeaderInBody(List<String> messageBody) {
int maxID = 0;
if (messageBody.size() > 0){
for (String leaderCandidate : messageBody){
if (Integer.parseInt(leaderCandidate.trim()) > maxID) {
maxID = Integer.parseInt(leaderCandidate.trim());
}
}
}
return maxID+"";
}