Zookeeper分布式全局唯一ID生成

在大型分布式系统中,经常有生成全局唯一标识的需求,支付、订单、红包、优惠券、跟踪号等等;

分布式ID生成系统

  1. 全局唯一,不能重复,(基本要求);
  2. 递增,下一个ID大于上一个ID;(某些需求)
  3. 信息安全,非连续ID,避免恶意用户/竞争对手发现ID规则,从而猜出下一个ID或者根据ID总量猜出业务总量;
  4. 高可用,不能故障,可用性4个9或者5个9;(99.99%、99.999%)
  5. 高QPS,性能不能太差,否则容易造成线程堵塞;
  6. 平均延迟尽可能低;

解决方案

UUID
UUID.randomUUID()
UUID太长,很多场景不适用;
有些场景希望id是数字的,UUID就不适用;
可读性不好;

数据库自增ID

auto_increment (mysql)
ID生成依赖数据库单机的读写性能;(高并发条件下性能不是很好)
对数据库依赖较大,数据库易发生性能瓶颈问题;

Redis方案

通过Redis原子操作命令INCR和INCRBY(redis自增)实现递增,同时可使用Redis集群提高吞吐量,集群后每台Redis的初始值为1,2,3,4,5,步长为5;
A:1,6,11,16,21
B:2,7,12,17,22
C:3,8,13,18,23
D:4,9,14,19,24
E:5,10,15,20,25
该方案是不错的;

Twiitter的snowflake算法

https://github.com/twitter/snowflake

Zookeeper方案

方案一:通过持久顺序节点实现;
方案二:通过节点版本号;

通过节点版本号;

public class IdGenerotor02 {

    private static final String ZK_ADDRESS = "127.0.0.1:2181";

    private static final String ID_NODE = "/id";

    CuratorFramework client = null;


    

    //如何连接zookeeper
    public IdGenerotor02() {
        //重试策略
        RetryPolicy retry = new RetryNTimes(3, 2000);
        //创建zookeeper连接,新版本
        //client = CuratorFrameworkFactory.newClient(ZK_ADDRESS, retry);
        //老版本创建连接客户端
        client = CuratorFrameworkFactory.builder().
                        connectString(ZK_ADDRESS).
                        sessionTimeoutMs(5000).
                        connectionTimeoutMs(10000).
                        retryPolicy(retry).
                        build();
        //启动客户端
        client.start();
    }

    /**
     * ID生成
     *
     * @return
     * @throws Exception
     */
    public long idGen() throws Exception {
        if (null == client.checkExists().forPath(ID_NODE)) {
            client.create().withMode(CreateMode.PERSISTENT)
                    .forPath(ID_NODE);
        }
        Stat stat = client.setData().withVersion(-1).forPath(ID_NODE);
        return stat.getVersion();
    }
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当面试中涉及到ZooKeeper分布式锁的问题,通常会涉及以下几个方面: 1. 什么是ZooKeeper分布式锁? ZooKeeper分布式锁是基于ZooKeeper提供的原语实现的一种分布式锁机制。它利用了ZooKeeper的有序临时节点和Watcher机制来实现锁的竞争和释放。 2. ZooKeeper分布式锁的实现原理是什么? ZooKeeper分布式锁的实现原理主要依赖于ZooKeeper的有序临时节点和Watcher机制。当一个线程需要获取锁时,它会在ZooKeeper的指定路径上创建一个有序临时节点,并且注册一个Watcher来监听前一个节点是否存在。如果前一个节点不存在,则该线程获取锁成功;否则,该线程需要等待前一个节点被删除后继续竞争锁。 3. ZooKeeper分布式锁存在的问题有哪些? ZooKeeper分布式锁虽然实现了基本的锁机制,但仍然存在以下问题: - 网络延迟:由于网络延迟等原因,可能导致锁的竞争时间增加,影响系统的性能。 - 节点故障:如果持有锁的节点发生故障,可能导致其他节点无法获取锁或长时间等待。 - 死锁:如果在获取锁的过程中发生故障或异常,可能导致死锁情况的发生。 4. 如何解决ZooKeeper分布式锁的问题? 为了解决ZooKeeper分布式锁存在的问题,可以采取以下策略: - 设置合理的超时时间,避免长时间等待导致系统性能下降。 - 使用心跳机制来检测节点的存活状态,及时处理节点故障。 - 采用分布式协调框架或工具,如Curator、Spring Integration等,简化分布式锁的使用和管理。 这些是一些常见的ZooKeeper分布式锁面试题及其答案,希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值