add ClusterEvent.UnreachableMember in WorkersListener to unregister from WorkersRefCenter

This commit is contained in:
pengys5 2017-03-10 22:35:52 +08:00
parent fce707e722
commit c2a1ef4d6d
6 changed files with 59 additions and 24 deletions

View File

@ -47,7 +47,6 @@ public abstract class AbstractWorker extends UntypedActor {
@Override
public void preStart() throws Exception {
cluster.subscribe(getSelf(), ClusterEvent.MemberUp.class);
register();
}
@Override
@ -71,7 +70,6 @@ public abstract class AbstractWorker extends UntypedActor {
@Override
public void onReceive(Object message) throws Throwable {
if (message instanceof ClusterEvent.CurrentClusterState) {
logger.info("receive ClusterEvent.CurrentClusterState message");
ClusterEvent.CurrentClusterState state = (ClusterEvent.CurrentClusterState) message;
for (Member member : state.getMembers()) {
if (member.status().equals(MemberStatus.up())) {
@ -82,14 +80,6 @@ public abstract class AbstractWorker extends UntypedActor {
ClusterEvent.MemberUp memberUp = (ClusterEvent.MemberUp) message;
logger.info("receive ClusterEvent.MemberUp message, address: %s", memberUp.member().address().toString());
register(memberUp.member());
} else if (message instanceof ClusterEvent.MemberEvent) {
System.out.println("other event: " + message.getClass().getSimpleName());
} else if (message instanceof ClusterEvent.UnreachableMember) {
System.out.println("other event: " + message.getClass().getSimpleName());
} else if (message instanceof ClusterEvent.MemberJoined) {
System.out.println("other event: " + message.getClass().getSimpleName());
} else if (message instanceof ClusterEvent.ReachableMember) {
System.out.println("other event: " + message.getClass().getSimpleName());
} else {
logger.debug("worker class: %s, message class: %s", this.getClass().getName(), message.getClass().getName());
receive(message);
@ -126,9 +116,4 @@ public abstract class AbstractWorker extends UntypedActor {
getContext().actorSelection(member.address() + "/user/" + WorkersListener.WorkName).tell(registerMessage, getSelf());
}
}
void register() {
WorkerListenerMessage.RegisterMessage registerMessage = new WorkerListenerMessage.RegisterMessage(getClass().getSimpleName());
getContext().actorSelection("/user/" + WorkersListener.WorkName).tell(registerMessage, getSelf());
}
}

View File

@ -1,5 +1,6 @@
package com.a.eye.skywalking.collector.actor;
import akka.actor.ActorPath;
import akka.actor.ActorRef;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@ -26,6 +27,10 @@ public class WorkerRef {
actorRef.tell(message, sender);
}
public ActorPath path() {
return actorRef.path();
}
public String getWorkerRole() {
return workerRole;
}

View File

@ -3,6 +3,8 @@ package com.a.eye.skywalking.collector.cluster;
import akka.actor.ActorRef;
import akka.actor.Terminated;
import akka.actor.UntypedActor;
import akka.cluster.Cluster;
import akka.cluster.ClusterEvent;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@ -24,12 +26,19 @@ public class WorkersListener extends UntypedActor {
public static final String WorkName = "WorkersListener";
private Cluster cluster = Cluster.get(getContext().system());
@Override
public void preStart() throws Exception {
cluster.subscribe(getSelf(), ClusterEvent.UnreachableMember.class);
}
@Override
public void onReceive(Object message) throws Throwable {
if (message instanceof WorkerListenerMessage.RegisterMessage) {
WorkerListenerMessage.RegisterMessage register = (WorkerListenerMessage.RegisterMessage) message;
ActorRef sender = getSender();
getContext().watch(sender);
// getContext().watch(sender);
logger.info("register worker of role: %s, path: %s", register.getWorkRole(), sender.toString());
@ -37,6 +46,9 @@ public class WorkersListener extends UntypedActor {
} else if (message instanceof Terminated) {
Terminated terminated = (Terminated) message;
WorkersRefCenter.INSTANCE.unregister(terminated.getActor());
} else if (message instanceof ClusterEvent.UnreachableMember) {
ClusterEvent.UnreachableMember unreachableMember = (ClusterEvent.UnreachableMember) message;
WorkersRefCenter.INSTANCE.unregister(unreachableMember.member().address());
} else {
unhandled(message);
}

View File

@ -1,12 +1,10 @@
package com.a.eye.skywalking.collector.cluster;
import akka.actor.ActorRef;
import akka.actor.Address;
import com.a.eye.skywalking.collector.actor.WorkerRef;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
@ -24,13 +22,13 @@ public enum WorkersRefCenter {
private Map<ActorRef, WorkerRef> actorRefToWorkerRef = new ConcurrentHashMap<>();
public void register(ActorRef newActorRef, String workerRole) {
System.out.println("register: " + workerRole);
if (!roleToWorkerRef.containsKey(workerRole)) {
List<WorkerRef> actorList = Collections.synchronizedList(new ArrayList<WorkerRef>());
roleToWorkerRef.putIfAbsent(workerRole, actorList);
}
WorkerRef newWorkerRef = new WorkerRef(newActorRef, workerRole);
roleToWorkerRef.get(workerRole).add(newWorkerRef);
actorRefToWorkerRef.put(newActorRef, newWorkerRef);
}
@ -41,6 +39,27 @@ public enum WorkersRefCenter {
actorRefToWorkerRef.remove(oldActorRef);
}
public void unregister(Address address) {
Iterator<ActorRef> actorRefToWorkerRefIterator = actorRefToWorkerRef.keySet().iterator();
while (actorRefToWorkerRefIterator.hasNext()) {
if (address.equals(actorRefToWorkerRefIterator.next().path().address())) {
actorRefToWorkerRefIterator.remove();
}
}
Iterator<Map.Entry<String, List<WorkerRef>>> roleToWorkerRefIterator = roleToWorkerRef.entrySet().iterator();
while (roleToWorkerRefIterator.hasNext()) {
List<WorkerRef> workerRefList = roleToWorkerRefIterator.next().getValue();
Iterator<WorkerRef> workerRefIterator = workerRefList.iterator();
while (workerRefIterator.hasNext()) {
if (workerRefIterator.next().path().address().equals(address)) {
workerRefIterator.remove();
}
}
}
}
/**
* Get all available {@link WorkerRef} list, by the given worker role.
*

View File

@ -14,10 +14,24 @@ akka {
"com.google.protobuf.Message" = proto
"com.a.eye.skywalking.messages.ISerializable" = data
"com.google.gson.JsonObject" = json
// "java.io.Serializable" = none
// "java.io.Serializable" = none
}
// serialize-messages = on
// serialize-messages = on
warn-about-java-serializer-usage = on
}
remote {
log-remote-lifecycle-events = off
netty.tcp {
hostname = "127.0.0.1"
port = 1000
}
}
cluster {
auto-down-unreachable-after = off
metrics.enabled = off
}
}

View File

@ -1,4 +1,4 @@
cluster.current.hostname=127.0.0.1
cluster.current.port=1000
cluster.current.roles=[WorkersListener, TraceSegmentReceiver, NodeInstancePersistence]
cluster.nodes=["akka.tcp://CollectorSystem@127.0.0.1:1000", "akka.tcp://CollectorSystem@127.0.0.1:1002"]
cluster.nodes=["akka.tcp://CollectorSystem@127.0.0.1:1000", "akka.tcp://CollectorSystem@127.0.0.1:1001", "akka.tcp://CollectorSystem@127.0.0.1:1002"]