依赖Zookeeper生成全局唯一序列号

依赖Zookeeper生成全局唯一序列号,第1张

依赖Zookeeper生成全局唯一序列号


下面两张图片来自:http://www.open-open.com/doc/view/2e0a82e0081d489dace301a2c512053c。

Zookeeper服务项目的安装、配备和启动以及手机客户端的实际 *** 作请参考:

http://aiilive.blog.51cto.com/1925756/1684451

http://aiilive.blog.51cto.com/1925756/1684145


1.序列号是使用Zookeeper的znode数据信息版本形成的。


实际 *** 作是使用zkClient包完成的:

//提早建立好储存Seq的"/createSeq"节点 CreateMode.PERSISTENT public static final String SEQ_ZNODE = "/seq" //根据znode数据信息版本完成分布式系统seq形成 public static class Task1 implements Runnable {     private final String taskName;     public Task1(String taskName) {         this.taskName = taskName;     }     @Override     public void run() {         ZkClient zkClient = new ZkClient("192.168.88.153:2181", 3000, 1000);         Stat stat = zkClient.writeData(SEQ_ZNODE, new byte[0], -1);         int versionAsSeq = stat.getVersion();         System.out.println(taskName  " obtain seq="  versionAsSeq);         zkClient.close();     } } //main final ExecutorService service = Executors.newFixedThreadPool(20); for (int i = 0; i < 20; i) {     service.execute(new Task1("[Concurrent-"  i  "]")); }


2.使用临时序列号znode完成和分布式锁持久性znode完成。


2.1下图是使用分布式锁持久化znode完成的。


手机采用阿帕奇策展人架构,代号https://code.csdn.net/snippets/929300.



2.2使用带有序列号的临时znode。

手机选择:https://github.com/adyliu/zkclientZK客户端


//提早建立好锁目标的节点"/lock" CreateMode.PERSISTENT public static final String LOCK_ZNODE = "/lock";


//分布式锁完成分布式系统seq形成 public static class Task2 implements Runnable, IZkChildListener {     private final String taskName;     private final ZkClient zkClient;     private final String lockPrefix = "/loc";     private final String selfZnode;     public Task2(String taskName) {         this.taskName = taskName;         zkClient = new ZkClient("192.168.88.153:2181", 30000, 10000);         selfZnode = zkClient.createEphemeralSequential(LOCK_ZNODE  lockPrefix, new byte[0]);     }     @Override     public void run() {         zkClient.subscribeChildChanges(LOCK_ZNODE, this);         do {         } while (zkClient.isConnected());     }     private void createSeq() {         Stat stat = new Stat();         byte[] oldData = zkClient.readData(LOCK_ZNODE, stat);         byte[] newData = update(oldData);         zkClient.writeData(LOCK_ZNODE, newData);         System.out.println(taskName  selfZnode  " obtain seq="  new String(newData));     }     private byte[] update(byte[] currentData) {         String s = new String(currentData);         int d = Integer.parseInt(s);         d = d  1;         s = String.valueOf(d);         return s.getBytes();     }     @Override     public void handleChildChange(String parentPath, List<String> currentChildren) throws Exception {         String[] childrensZnode = currentChildren.toArray(new String[currentChildren.size()]);         Arrays.sort(childrensZnode);         String minZnode = LOCK_ZNODE  "/"  childrensZnode[0];         if (selfZnode.equals(minZnode)) {             createSeq();             zkClient.unsubscribeChildChanges(LOCK_ZNODE, this);             zkClient.delete(selfZnode);             zkClient.close();         }     } }


详细代码参考:https://code.csdn.net/snippets/929320

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/779958.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-04
下一篇 2022-05-04

发表评论

登录后才能评论

评论列表(0条)

保存