下面2张图来自: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;}@Overridepublic 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

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]);}@Overridepublic 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();}@Overridepublic 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

依赖Zookeeper生成全局唯一序列号相关推荐

  1. 全局唯一序列号的生成

    概要:借助数据库自增主键实现全局唯一序列号的生成:将自增主键放大后,形成区间号段,在内存中分配,从而避免频繁的IO,当达到号段最大值时,重新从数据库获取号段. 一.搭建测试 application.y ...

  2. 如何在分布式场景下生成全局唯一 ID ?

    作者 l 会点代码的大叔(CodeDaShu) 在分布式系统中,有一些场景需要使用全局唯一 ID ,可以和业务场景有关,比如支付流水号,也可以和业务场景无关,比如分库分表后需要有一个全局唯一 ID,或 ...

  3. 全局唯一递增的id_生成全局唯一id的几种方式

    生成全局唯一id的几种方式: 1.uuid生成全球唯一id,生成方式简单粗暴,本地生成,没有网络开销,效率高:缺点长度较长,没有递增趋势性,不易维护,常用于生成token令牌. 2.mysql自带自增 ...

  4. 高并发分布式系统中生成全局唯一Id汇总

    全局唯一ID <高并发分布式系统中生成全局唯一Id汇总> Twitter 方案(Snowflake 算法):41位时间戳+10位机器标识(比如IP,服务器名称等)+12位序列号(本地计数器 ...

  5. 如何在高并发分布式系统中生成全局唯一Id

    又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文,后续再奉上.最近还写了一个发邮件的组件以及性能测试请看 <NET开发邮件发送功能的全面教程(含邮件组件源码)> ,还弄了 ...

  6. 高并发分布式系统中生成全局唯一订单号

    高并发分布式系统中生成全局唯一订单号 我了解的方案如下-------------------------- 1.  使用数据库自增Id 优势:编码简单,无需考虑记录唯一标识的问题. 缺陷: 1)    ...

  7. Redis生成全局唯一ID

    简介: 全局唯一ID生成器是一种在分布式系统下用来生成全局唯一ID的工具 特性: 唯一性 高性能 安全性 高可用 递增性 生成规则: 有时为了增加ID的安全性,我们可以不直接使用Redis自增的数值, ...

  8. 高并发分布式系统中生成全局唯一(订单号)Id

    2019独角兽企业重金招聘Python工程师标准>>> 高并发分布式系统中生成全局唯一(订单号)Id 1.GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么通过组合的 ...

  9. 雪花算法及运用PHP,雪花算法生成全局唯一ID,参考了下网上雪花算法生成规则,机器ID和序列号自动获取 理论上毫秒可生成 1024*4096个唯一ID

    任务要求毫秒生成10000个唯一ID 研究了下twitter/snowflake的算法思想: 参考了下网上雪花算法生成规则,把数据中心和机器编号整合一起,变成10位机器ID, 机器ID和序列号自动获取 ...

最新文章

  1. C++入门之常量与变量
  2. C语言攻略指南(五)数组篇
  3. c 自定义实现string类 clear_CC++语言15|类的继承和派生实现代码重用、扩充
  4. BZOJ-1922 大陆争霸 多限制、分层图最短路 (堆+dijkstra)
  5. c++如何获取文件时间_3分钟短文 | PHP 如何优雅地获取文件扩展名?别再explode了
  6. python 判断列表所有元素是否为某个值_这应该是最详细的Python入门基础语法总结!...
  7. Linux小知识--通过MAC地址查询厂家OUI(成功率很高)
  8. iOS宏定义的黑魔法 - 宏菜鸟起飞手册
  9. spring-config.xml的annotation-driven详解
  10. “Apache官网打不开”怎么办?
  11. html5文档样式,jQuery HTML5文件上传美化插件jQuery.filer
  12. IAR for ARM系列教程(四)_菜单(Ⅱ)
  13. model.parameters()的理解与使用
  14. 关于String字符串的比较
  15. Mat结构及其它数据类型详解
  16. Visual Studio 2010 项目属性配置
  17. Python 读书笔记(1)
  18. Internet 上可用的“简单网络时间协议”时间服务器列表
  19. javascript 的七种继承方式(三)组合继承
  20. 从《乔布斯传》里得到的20条经验和教训

热门文章

  1. 若川的2017年度总结,一如既往
  2. Nginx学习系列二Linux下Nginx实现负载均衡
  3. 大数据之MySql笔记-0916
  4. Android--Activity四种启动模式
  5. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录
  6. 监控cacti中的RRDtool用法详解
  7. 关于最近打的几题斜率优化的总结。加几AC代码。
  8. NLB+Cluster(一)
  9. 2010年5月系统集成项目管理工程师上午试卷参考答案(讨论版)
  10. SEO | 重新认识一下Meta标签