分布式专题 – Dubbo + Zookeeper
雪花算法的原理
第一位符号位固定为0,41位时间戳,10位workld,12位序列号,位数可以有不同实现
优点:
每个毫秒值包含的ID值很多,不够可以变动位数来增加,性能佳 (依赖workld的实现)。.时间戳值在高位,中间是固定的机器码,自增的序列在低位,整个ID是趋势递增的。0能够根据业务场景数据库节点布置灵活调整bit位划分,灵活度高。
缺点:
强依赖于机器时钟,如果时钟回拔,会导致重复的ID生成,所以一般基于此的算法发现时钟回拨,都会抛异常.
处理,阻止ID生成,这可能导致服务不可用。
为什么Zookeeper可以用来作为注册中心
可以利用Zookeeper的临时节点和watch机制来实现注册中心的自动注册和发现,另外Zookeeper中的数据都是存在内存中的,并且Zookeeper底层采用了nio,多线程模型,所以Zokeeper的性能也是比较高的,所以可以用来作为注册中心,但是如果考虑到注册中心应该是注册可用性的话,那么Zookeeper则不太合适,因为Zookeeper是CP的,它注重的是一致性,所以集群数据不-致时,集群将不可用,所以用Redis、Eureka、Nacos来作为注册中心将更合适。
数据库实现分布式锁的问题及解决方案
利用唯一约束键存储key,insert成功则代表获取锁成功,失败则获取失败,操作完成需要删除锁问题:
非阻塞,锁获取失败后没有排队机制,需要自己编码实现阻塞,可以使用自旋,直到获取锁;
不可重入,如果加锁的方法需要递归,则第二次插入会失败,可以使用记录线程标识解决重入问题;
死锁,删除锁失败、则其他线程没办法获取锁,可以设置超时时间、使用定时任务检查.
数据库单点故障,数据库高可用。