Java核心技术面试精讲
杨晓峰
前Oracle首席工程师
立即订阅
43117 人已学习
课程目录
已完结 43 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 以面试题为切入点,有效提升你的Java内功
免费
模块一 Java基础 (14讲)
第1讲 | 谈谈你对Java平台的理解?
第2讲 | Exception和Error有什么区别?
第3讲 | 谈谈final、finally、 finalize有什么不同?
第4讲 | 强引用、软引用、弱引用、幻象引用有什么区别?
第5讲 | String、StringBuffer、StringBuilder有什么区别?
第6讲 | 动态代理是基于什么原理?
第7讲 | int和Integer有什么区别?
第8讲 | 对比Vector、ArrayList、LinkedList有何区别?
第9讲 | 对比Hashtable、HashMap、TreeMap有什么不同?
第10讲 | 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?
第11讲 | Java提供了哪些IO方式? NIO如何实现多路复用?
第12讲 | Java有几种文件拷贝方式?哪一种最高效?
第13讲 | 谈谈接口和抽象类有什么区别?
第14讲 | 谈谈你知道的设计模式?
模块二 Java进阶 (16讲)
第15讲 | synchronized和ReentrantLock有什么区别呢?
第16讲 | synchronized底层如何实现?什么是锁的升级、降级?
第17讲 | 一个线程两次调用start()方法会出现什么情况?
第18讲 | 什么情况下Java程序会产生死锁?如何定位、修复?
第19讲 | Java并发包提供了哪些并发工具类?
第20讲 | 并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?
第21讲 | Java并发类库提供的线程池有哪几种? 分别有什么特点?
第22讲 | AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?
第23讲 | 请介绍类加载过程,什么是双亲委派模型?
第24讲 | 有哪些方法可以在运行时动态生成一个Java类?
第25讲 | 谈谈JVM内存区域的划分,哪些区域可能发生OutOfMemoryError?
第26讲 | 如何监控和诊断JVM堆内和堆外内存使用?
第27讲 | Java常见的垃圾收集器有哪些?
第28讲 | 谈谈你的GC调优思路?
第29讲 | Java内存模型中的happen-before是什么?
第30讲 | Java程序运行在Docker等容器环境有哪些新问题?
模块三 Java安全基础 (2讲)
第31讲 | 你了解Java应用开发中的注入攻击吗?
第32讲 | 如何写出安全的Java代码?
模块四 Java性能基础 (3讲)
第33讲 | 后台服务出现明显“变慢”,谈谈你的诊断思路?
第34讲 | 有人说“Lambda能让Java程序慢30倍”,你怎么看?
第35讲 | JVM优化Java代码时都做了什么?
模块5 Java应用开发扩展 (4讲)
第36讲 | 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
第37讲 | 谈谈Spring Bean的生命周期和作用域?
第38讲 | 对比Java标准NIO类库,你知道Netty是如何实现更高性能的吗?
第39讲 | 谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
周末福利 (2讲)
周末福利 | 谈谈我对Java学习和面试的看法
周末福利 | 一份Java工程师必读书单
结束语 (1讲)
结束语 | 技术没有终点
Java核心技术面试精讲
登录|注册

第39讲 | 谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?

杨晓峰 2018-08-07
专栏的绝大部分主题都侧重于 Java 语言和虚拟机,基本都是单机模式下的问题,今天我会补充一个分布式相关的问题。严格来说,分布式并不算是 Java 领域,而是一个单独的大主题,但确实也会在 Java 技术岗位面试中被涉及。在准备面试时,如果有丰富的分布式系统经验当然好;如果没有,你可以选择典型问题和基础技术进行适当准备。关于分布式,我自身的实战经验也非常有限,专栏里就谈谈从理论出发的一些思考。
今天我要问你的问题是,谈谈常用的分布式 ID 的设计方案?Snowflake 是否受冬令时切换影响?

典型回答

首先,我们需要明确通常的分布式 ID 定义,基本的要求包括:
全局唯一,区别于单点系统的唯一,全局是要求分布式系统内唯一。
有序性,通常都需要保证生成的 ID 是有序递增的。例如,在数据库存储等场景中,有序 ID 便于确定数据位置,往往更加高效。
目前业界的方案很多,典型方案包括:
基于数据库自增序列的实现。这种方式优缺点都非常明显,好处是简单易用,但是在扩展性和可靠性等方面存在局限性。
基于 Twitter 早期开源的Snowflake的实现,以及相关改动方案。这是目前应用相对比较广泛的一种方式,其结构定义你可以参考下面的示意图。
整体长度通常是 64 (1 + 41 + 10+ 12 = 64)位,适合使用 Java 语言中的 long 类型来存储。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Java核心技术面试精讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(14)

  • 董朱明
    69年的极限问题不难解决,timestamp减个常量就可以了,对于已生成的历史id,可以导表刷id,当然,这里涉及到个数据库设计原则,系统之间传递数据不应使用物理主键,这样刷id 就容易了

    作者回复: 高手

    2018-08-10
    32
  • 卡特
    因为snowflake的可预测性,可以提前生成好放到队列里,获取的时候直接获取。相当于做了一层缓存;
    理论上可以解决短时间大量获取id的需求;
    2018-09-12
    8
  • 黄琨
    缩减workID长度,增加序列号长度
    2018-08-07
    5
  • 袁伟
    一直有个疑问就是Snowflake 文中说的极限问题,目前确定它只能用69年,大家都用数据库的数字类型来存储,那么到了69年之后,后来人怎么处理,也许那个时候有更大数字来表示。但我还是想不出更合理的方式,也许我想多了,这个问题交给69年后的人来考虑,但我也想知道老师您是如何思考这个问题的
    2018-08-08
    1
    4
  • RoverYe
    我们这边利用zk的唯一id特性
    2018-09-15
    3
  • 影子
    生成32位的自增长Id(int)老师有什么思路嘛
    2019-01-24
    2
  • XiaoYeGe
    前后历时半年多 终于看完了, 下面就是再回头巩固一遍!
    2018-11-30
    2
  • 安小依
    老师自己有没有计划,针对分布式单独出一个专栏,一直以来自己都想研究分布式,但是很多问题依旧搞不懂: zookeeper 选举过程、hdfs 存储出现故障namenode是怎么处理、MapReduce 作业调度问题需要做哪些权衡,不同异常下应该怎么解决,是忽略错误,还是直接退出…各个方案背后是什么样的利弊在协调着这些…

    作者回复: 术业有专攻,有特定专家出专栏

    2018-08-08
    1
  • 三碗猪脚
    关于第二个问题,Snowflake 是否受冬令时切换影响?
    冬令时不是回拨一个小时吗?那例如我10月3号3时被回拨10月3号2时,中间是走了两次的,到当前时间也会重复,不是吗?
    2019-07-02
  • 吴科🍀
    我们通常用UUID或者数据自增主键,这样的方式效率都不高。snowflake分布式全局生成的ID,效率高,设计优雅。
    2018-12-29
  • airong
    请问大牛10集群编号怎么获取的啊
    2018-12-28
  • Yang.🍭
    使用System.currentTimeMillis的话不是存在时钟回拨问题么,能不能从网络获取时间,去生成这个😂😂
    2018-09-06
  • 涛哥
    能讲下下时钟偏斜和时钟回拨吗,不是理解
    2018-08-07
  • 有铭
    为啥最后一段是12的长度而不是别的数

    作者回复: 我提到了,各部分不是固定的,看业务需求,例如,集群小,位数可以设计短点儿,seq就可以更多位,时间也未必非要41位

    2018-08-07
收起评论
14
返回
顶部