加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:15:39 所属栏目:百科 来源:网络整理
导读:? 下面2张图来自:http://www.open-open.com/doc/view/2e0a82e0081d489dace301a2c512053c ?? ? 关于Zookeeper服务安装,配置,启动,客户端操作参见: ??http://www.voidcn.com/article/p-czczykuq-kn.html ??http://www.voidcn.com/article/p-atkufdff-kn.ht


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

??

? 关于Zookeeper服务安装,配置,启动,客户端操作参见:

??http://www.voidcn.com/article/p-czczykuq-kn.html

??http://www.voidcn.com/article/p-atkufdff-kn.html


1.利用Zookeeper的znode数据版本生成序列号

wKioL1XS7Crg6_YaAAQNPtfUuYg724.jpg


?利用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实现


客户端采用apache curator 框架,代码:https://code.csdn.net/snippets/929300


wKioL1XS7CrzHIyFAAQ4t7a79_I242.jpg


?2.2利用临时带序列号的znode实现

?客户端采用:zkClient (https://github.com/adyliu/zkclient)


//提前创建好锁对象的结点"/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://www.voidcn.com/article/p-stsiyghh-kn.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读