|
|
@@ -69,44 +69,44 @@ public class RedisHaManager implements HaManager {
|
|
|
current.setLastKeepAlive(System.currentTimeMillis());
|
|
|
|
|
|
inRedisNode.put(allNodeHashKey, current.getId(), current)
|
|
|
- .subscribe();
|
|
|
+ .subscribe();
|
|
|
|
|
|
keepalive.publish(Mono.just(current)).subscribe();
|
|
|
|
|
|
Map<String, ServerNode> maybeOffline = getAllNode()
|
|
|
- .stream()
|
|
|
- .filter(node -> System.currentTimeMillis() - node.getLastKeepAlive() > TimeUnit.SECONDS.toMillis(30))
|
|
|
- .filter(node -> !node.isSame(current))
|
|
|
- .collect(Collectors.toMap(ServerNode::getId, Function.identity()));
|
|
|
+ .stream()
|
|
|
+ .filter(node -> System.currentTimeMillis() - node.getLastKeepAlive() > TimeUnit.SECONDS.toMillis(30))
|
|
|
+ .filter(node -> !node.isSame(current))
|
|
|
+ .collect(Collectors.toMap(ServerNode::getId, Function.identity()));
|
|
|
|
|
|
//检查节点是否离线
|
|
|
inRedisNode.keys(allNodeHashKey)
|
|
|
- .filter(maybeOffline::containsKey)
|
|
|
- .map(maybeOffline::get)
|
|
|
- .collectList()
|
|
|
- .filter(list -> !list.isEmpty())
|
|
|
- .flatMapMany(list -> inRedisNode
|
|
|
- .remove(allNodeHashKey, list.stream().map(ServerNode::getId).toArray())
|
|
|
- .thenMany(Flux.fromIterable(list))
|
|
|
- )
|
|
|
- .as(offlineTopic::publish)
|
|
|
- .subscribe();
|
|
|
+ .filter(maybeOffline::containsKey)
|
|
|
+ .map(maybeOffline::get)
|
|
|
+ .collectList()
|
|
|
+ .filter(list -> !list.isEmpty())
|
|
|
+ .flatMapMany(list -> inRedisNode
|
|
|
+ .remove(allNodeHashKey, list.stream().map(ServerNode::getId).toArray())
|
|
|
+ .thenMany(Flux.fromIterable(list))
|
|
|
+ )
|
|
|
+ .as(offlineTopic::publish)
|
|
|
+ .subscribe();
|
|
|
}
|
|
|
|
|
|
private void electionLeader() {
|
|
|
allNode.values()
|
|
|
- .stream()
|
|
|
- .peek(serverNode -> serverNode.setLeader(false))
|
|
|
- .min(Comparator.comparing(ServerNode::getUptime))
|
|
|
- .ifPresent(serverNode -> serverNode.setLeader(true));
|
|
|
+ .stream()
|
|
|
+ .peek(serverNode -> serverNode.setLeader(false))
|
|
|
+ .min(Comparator.comparing(ServerNode::getUptime))
|
|
|
+ .ifPresent(serverNode -> serverNode.setLeader(true));
|
|
|
}
|
|
|
|
|
|
public void shutdown() {
|
|
|
inRedisNode
|
|
|
- .remove(allNodeHashKey, current.getId())
|
|
|
- .then(offlineTopic
|
|
|
- .publish(Mono.just(current)))
|
|
|
- .block();
|
|
|
+ .remove(allNodeHashKey, current.getId())
|
|
|
+ .then(offlineTopic
|
|
|
+ .publish(Mono.just(current)))
|
|
|
+ .block();
|
|
|
}
|
|
|
|
|
|
public synchronized void startup() {
|
|
|
@@ -118,64 +118,66 @@ public class RedisHaManager implements HaManager {
|
|
|
|
|
|
//注册自己
|
|
|
inRedisNode.put(allNodeHashKey, current.getId(), current)
|
|
|
- .flatMapMany(r -> inRedisNode.values(allNodeHashKey))
|
|
|
- .collectList()
|
|
|
- .doOnNext(node -> {
|
|
|
- for (ServerNode serverNode : node) {
|
|
|
- serverNode.setLastKeepAlive(System.currentTimeMillis());
|
|
|
- allNode.put(serverNode.getId(), serverNode);
|
|
|
- }
|
|
|
- electionLeader();
|
|
|
- Flux.interval(Duration.ZERO, Duration.ofSeconds(5))
|
|
|
- .doOnNext(i -> this.checkAlive())
|
|
|
- .subscribe();
|
|
|
- })
|
|
|
- .block();
|
|
|
+ .flatMapMany(r -> inRedisNode.values(allNodeHashKey))
|
|
|
+ .collectList()
|
|
|
+ .doOnNext(node -> {
|
|
|
+ for (ServerNode serverNode : node) {
|
|
|
+ serverNode.setLastKeepAlive(System.currentTimeMillis());
|
|
|
+ allNode.put(serverNode.getId(), serverNode);
|
|
|
+ }
|
|
|
+ electionLeader();
|
|
|
+ Flux.interval(Duration.ZERO, Duration.ofSeconds(5))
|
|
|
+ .doOnNext(i -> this.checkAlive())
|
|
|
+ .subscribe();
|
|
|
+ })
|
|
|
+ .block();
|
|
|
|
|
|
offlineTopic.subscribe()
|
|
|
- .subscribe(serverNode -> {
|
|
|
- //自己
|
|
|
- if (currentServer().isSame(serverNode)) {
|
|
|
- return;
|
|
|
- }
|
|
|
- if (allNode.remove(serverNode.getId()) != null) {
|
|
|
- log.debug("[{}]:server node [{}] offline", haName, serverNode.getId());
|
|
|
- //node offline
|
|
|
- inRedisNode
|
|
|
- .remove(allNodeHashKey, serverNode.getId())
|
|
|
- .subscribe();
|
|
|
- electionLeader();
|
|
|
- if (offlineProcessor.hasDownstreams()) {
|
|
|
- offlineProcessor.onNext(serverNode);
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
+ .subscribe(serverNode -> {
|
|
|
+ //自己
|
|
|
+ if (currentServer().isSame(serverNode)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (allNode.remove(serverNode.getId()) != null) {
|
|
|
+ log.debug("[{}]:server node [{}] offline", haName, serverNode.getId());
|
|
|
+ //node offline
|
|
|
+ inRedisNode
|
|
|
+ .remove(allNodeHashKey, serverNode.getId())
|
|
|
+ .subscribe();
|
|
|
+ electionLeader();
|
|
|
+ if (offlineProcessor.hasDownstreams()) {
|
|
|
+ offlineProcessor.onNext(serverNode);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
//其他节点定时发布
|
|
|
- keepalive.subscribe()
|
|
|
- .subscribe(serverNode -> {
|
|
|
- //自己
|
|
|
- if (currentServer().isSame(serverNode)) {
|
|
|
- return;
|
|
|
- }
|
|
|
- serverNode.setLastKeepAlive(System.currentTimeMillis());
|
|
|
- allNode.compute(serverNode.getId(), (id, node) -> {
|
|
|
- if (node != null) {
|
|
|
- node.setLastKeepAlive(System.currentTimeMillis());
|
|
|
- return node;
|
|
|
- }
|
|
|
- return null;
|
|
|
- });
|
|
|
- if (!allNode.containsKey(serverNode.getId())) {
|
|
|
- allNode.put(serverNode.getId(), serverNode);
|
|
|
- electionLeader();
|
|
|
- log.debug("[{}]:server node [{}] online", haName, serverNode.getId());
|
|
|
- //node join
|
|
|
- if (onlineProcessor.hasDownstreams()) {
|
|
|
- onlineProcessor.onNext(serverNode);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- });
|
|
|
+ keepalive.subscribePattern()
|
|
|
+// .map(ClusterTopic.TopicMessage::getMessage)
|
|
|
+ .subscribe(msg -> {
|
|
|
+ ServerNode serverNode = msg.getMessage();
|
|
|
+ //自己
|
|
|
+ if (currentServer().isSame(serverNode)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ serverNode.setLastKeepAlive(System.currentTimeMillis());
|
|
|
+ allNode.compute(serverNode.getId(), (id, node) -> {
|
|
|
+ if (node != null) {
|
|
|
+ node.setLastKeepAlive(System.currentTimeMillis());
|
|
|
+ return node;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ });
|
|
|
+ if (!allNode.containsKey(serverNode.getId())) {
|
|
|
+ allNode.put(serverNode.getId(), serverNode);
|
|
|
+ electionLeader();
|
|
|
+ log.debug("[{}]:server node [{}] online", haName, serverNode.getId());
|
|
|
+ //node join
|
|
|
+ if (onlineProcessor.hasDownstreams()) {
|
|
|
+ onlineProcessor.onNext(serverNode);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
|
|
|
|
|
|
}
|
|
|
@@ -188,13 +190,13 @@ public class RedisHaManager implements HaManager {
|
|
|
@Override
|
|
|
public Flux<ServerNode> subscribeServerOnline() {
|
|
|
return onlineProcessor
|
|
|
- .filter(node -> !node.getId().equals(current.getId()));
|
|
|
+ .filter(node -> !node.getId().equals(current.getId()));
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public Flux<ServerNode> subscribeServerOffline() {
|
|
|
return offlineProcessor
|
|
|
- .filter(node -> !node.getId().equals(current.getId()));
|
|
|
+ .filter(node -> !node.getId().equals(current.getId()));
|
|
|
}
|
|
|
|
|
|
@Override
|