针对Zookeeper能够实现的应用封装

  • Master/leader选举
  • 分布式锁(读锁/写锁)
  • 分布式队列

curator-reciples提供的API

  • LeaderLatch
    • 阻塞
    • 都一起去抢,后续没抢到的等待
  • LeaderSelector
    • 自动抢
    • 带有序节点的选举过程,根据最小节点来获得优先权,用完以后释放,下一个节点继续去用

对于网络抖动的处理

  • 对于网络抖动,如果本次抢master的节点之前是master,那就继续用本地节点当master.
  • 客户端和服务端建立一个连接是建立一个session,如果出现网络不稳定或异常情况下,消息传输可能会出现丢包,如果出现丢包,客户端则认为session已经失效,实际上master并没有失效。

代码示例

Leader选举

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.bai.curator.scene;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.leader.LeaderSelector;
import org.apache.curator.framework.recipes.leader.LeaderSelectorListenerAdapter;
import org.apache.curator.retry.ExponentialBackoffRetry;

import java.util.concurrent.TimeUnit;

/**
* Created by 2bai on 30/10/2017.
*/
public class MasterSelector {

private final static String CONNECTSTRING = "";
private final static String MASTER_PATH="/curator_master_path";

public static void main(String[] args) {
CuratorFramework curatorFramework = CuratorFrameworkFactory.builder().connectString(CONNECTSTRING).retryPolicy(new ExponentialBackoffRetry(1000,3)).build();
LeaderSelector leaderSelector=new LeaderSelector(curatorFramework, MASTER_PATH, new LeaderSelectorListenerAdapter() {
@Override
public void takeLeadership(CuratorFramework curatorFramework) throws Exception {
System.out.println("获得leader成功");
TimeUnit.SECONDS.sleep(2);
}
});
//自动争抢
leaderSelector.autoRequeue();
//开始选举
leaderSelector.start();
}
}