本文主要研究一下Election Algorithmshtml
Election Algorithms大體有兩類,一類是Garcia-Molina提出的Bully Election,一類是Chang & Roberts's Token Ring Election algorithm;對於大多數的election algorithms一般有以下幾個假定:node
這裏採用distributedLeaderElection的實現git
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+""; }