zookeeper应用场景之分布式的ID生成器

news2024/11/17 11:54:40

1. 分布式ID生成器的使用场景

        在分布式系统中,分布式ID生成器的使用场景非常之多

  • 大量的数据记录,需要分布式ID。
  • 大量的系统消息,需要分布式ID。
  • 大量的请求日志,如restful的操作记录,需要唯一标识,以便进行后续的用户行为分析和调用链路分析。
  • 分布式节点的命名服务,往往也需要分布式ID。
  • ......

        传统的数据库自增主键已经不能满足需求。在分布式系统环境中,需要一种全新的唯一ID系统,这种系统需要满足以下需求:

(1)全局唯一:不能出现重复ID。

(2)高可用:ID生成系统是基础系统,被许多关键系统调用,一旦宕机,就会造成严重影响。

2. 分布式的ID生成器方案

        生成分布式ID的方案有哪些呢? 大概有以下几种方案

  • Java的UUID。
  • 分布式缓存Redis生成ID:利用Redis的原子操作INCR和INCRBY,生成全局唯一的ID。
  • Twitter的SnowFlake算法。
  • ZooKeeper生成ID:利用ZooKeeper的顺序节点,生成全局唯一的ID。
  • MongoDb的ObjectId:MongoDB是一个分布式的非结构化NoSQL数据库,每插入一条记录会自动生成全局唯一的一个“_id”字段值,它是一个12字节的字符串,可以作为分布式系统中全局唯一的ID。

3. Zookeeper实现分布式ID生成器

        接下来,我们可以通过创建ZooKeeper的临时顺序节点的方法,生成全局唯一的ID。

代码:

public class IDMaker {
    private final static  String CLUSTER_CONNECT_STR="192.168.31.5:2181,192.168.31.176:2181,192.168.31.232:2181";

    private static String createSeqNode(String pathPefix,CuratorFramework curatorFramework) throws Exception {

        //创建一个临时顺序节点
        String destPath = curatorFramework.create()
                .creatingParentsIfNeeded()
                .withMode(CreateMode.EPHEMERAL_SEQUENTIAL)
                .forPath(pathPefix);
        return destPath;
    }

    public static String  makeId(String path,CuratorFramework curatorFramework) throws Exception {
        String str = createSeqNode(path,curatorFramework);
        if(null != str){
            //获取末尾的序号
            int index = str.lastIndexOf(path);
            if(index>=0){
                index+=path.length();
                return index<=str.length() ? str.substring(index):"";
            }
        }
        return str;
    }

    public static void main(String[] args) throws InterruptedException {
        //构建客户端实例
        CuratorFramework curatorFramework= CuratorFrameworkFactory.builder()
                .connectString(CLUSTER_CONNECT_STR)
                .retryPolicy(new ExponentialBackoffRetry(1000,3)) // 设置重试策略
                .build();
        //启动客户端
        curatorFramework.start();

        String pathPrefix = "/idmarker/id-";
        //模拟5个线程创建id
        for(int i=0;i<5;i++){
            new Thread(()->{
                for (int j=0;j<10;j++){
                    String id = null;
                    try {
                        id = makeId(pathPrefix,curatorFramework);
                        System.out.println("线程{"+Thread.currentThread().getName()+"}第{"+j+"}次创建id为{"+id+"}");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            },"thread"+i).start();
        }

        Thread.sleep(Integer.MAX_VALUE);

    }

}

运行main方法:运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1359423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式(7)

目录 31.基于Zookeeper如何实现分布式锁&#xff1f; 32.什么是ACID&#xff1f; 33.什么是分布式的XA协议&#xff1f; 34.什么是2PC&#xff1f; 35.什么是3PC&#xff1f; 31.基于Zookeeper如何实现分布式锁&#xff1f; 顺序节点 创建一个用于发号的节点“/test/lock…

Mybatis缓存实现方式

文章目录 装饰器模式Cache 接口及核心实现Cache 接口装饰器1. BlockingCache2. FifoCache3. LruCache4. SoftCache5. WeakCache 小结 缓存是优化数据库性能的常用手段之一&#xff0c;我们在实践中经常使用的是 Memcached、Redis 等外部缓存组件&#xff0c;很多持久化框架提供…

Unity3D Shader 之透视效果XRay

1、 Shader "Unlit/XRay" {Properties{_MainTex("Texture", 2D) "white" {}// 漫反射_Diffuse("Diffuse", COLOR) (1,1,1,1)// XRay 效果_XRayColor("XRay Color", COLOR) (0,1,1,1)_XRayPower("XRay Power",…

python识别验证码+灰度图片base64转换图片

一、为后面识别验证码准备 1、base64转换为图片&#xff0c;保存本地、并且置灰 上文中的base64,后面的就是包含Base64编码的PNG图像的字符串复制下来 import base64 from PIL import Image import io# 这里是你的Base64编码的字符串 base64_data "iVBORw0KGgoAAAANSUhE…

记录汇川:水塔指令解释-ST

可以通过帮助查看指令手册 PLC的IO地址映射-两种方法 第一种&#xff1a; 新建一个全局变量表&#xff0c;按照如图所示建立IO地址 第二种&#xff1a; 直接如图所示位置定义名字 注意&#xff1a;IW和QB这两个前面一个有蓝色M一个没有。 蓝色的M表示模块发生变化的时候地址不会…

不用愁企业内部知识库搭建啦,照着这样做轻松解决

在现代企业中&#xff0c;知识是一项宝贵的资源。拥有一个完善的内部知识库可以帮助企业有效地管理和分享知识&#xff0c;提高团队的协作效率&#xff0c;促进创新和发展。然而&#xff0c;对于很多企业来说&#xff0c;搭建一个高效的知识库可能会成为一项具有挑战性的任务。…

【docker】cgroups资源限制

目录 一、cpu资源控制 1、 设置cpu使用率上限 2、设置cpu资源占用比&#xff08;设置多个容器时才有效&#xff09;Docker通过–cpu-shares指定cpu份额&#xff0c;默认为1024&#xff0c;值为1024的倍数。 3、设置容器绑定指定的CPU 三、内存资源控制 四、磁盘IO配额控制…

非接触式红外测温MLX90614

1.MLX90614简介 MX90614是一款由迈来芯公司提供的低成本&#xff0c;无接触温度计。输出数据和物体温度呈线性比例&#xff0c;具有高精度和高分辨率。TO-39金属封装里同时集成了红外感应热电堆探测器芯片MLX81101&#xff08;温度是通过PTC或是PTAT元件测量&#xff09;和信号…

原生微信小程序如何动态修改svg图片颜色及尺寸、宽高(封装svgIcon组件)

最终效果 前言 动态设置Svg图片颜色就是修改Svg源码的path中的fill属性&#xff0c; 通过wx.getFileSystemManager().readFile读取.xlsx文件 把文件转成base64 封装svg-icon组件 1、在项目的components下新建svg-icon文件夹&#xff0c;新增base64.js文件 class Base64 {cons…

深圳易图讯实景三维数字孪生系统 实景三维电子沙盘

深圳易图讯实景三维数字孪生系统是一款基于三维地理空间的数字孪生系统&#xff0c;首先&#xff0c;该系统集成了多维度地理空间数据&#xff0c;可以将各类数据与应用需求进行充分整合&#xff0c;实现数据跨界融合、场景全角度可视等功能。其次&#xff0c;该系统具备智能化…

36V到80V降5V1A电源芯片WT6039

36V到80V降5V1A电源芯片WT6039 宽电压12V到90V的降压DC-DC转换器WT6039&#xff0c;功能强大&#xff0c;使用广泛。 WT6039是一款功能非常强大的降压DC-DC转换器芯片&#xff0c;它在12V到90V的宽电压范围内都能正常工作。WT6039不仅具有使能开关控制、参考电源、误差放大器等…

gRPC - 分布式 gRPC 四种通信方式、三种代理方式(全代码演示)

目录 一、分布式 gRPC 开发 1.1、项目结构 & 前置说明 1.1.1、项目结构 1.1.2、protoc 必备依赖 1.1.3、推荐插件&#xff08;简化开发&#xff09; 1.1.4、protoc 生成 Java 代码说明 1.2、一元 RPC&#xff08;代理方式一&#xff1a;阻塞式 BlockingStub&#xff…

深度学习中的准确率、精确率(查准率)、召回率(查全率)、F1值、ROC曲线的AUC值,

混淆矩阵 其中关于 TP, TN; FP, FN 的解释&#xff1b; 其中首字母 T&#xff0c;F代表预测的情况&#xff0c;即T代表预测的结果是对的&#xff0c; F代表预测的结果是错误的&#xff1b; 第二个字母代表预测是预测为 正样本&#xff0c;还是负样本&#xff0c; Positve 代表…

Python实现某城市从站点API获取天气状况示例(Crossin教室实例24)

一、要点说明&#xff1a; 根据站点当前API数据是由‘\r’字符连接的字符串的特点&#xff0c;主要用到了字符串的split()方法。此方法参数就是‘\r’。函数返回值是被分隔的字符串的列表。通过使用列表索引就可以分项取到天气数据。 二、示例代码&#xff1a; import reque…

面试被问了几百遍的 IOC 和 AOP ,一篇文章带你搞清楚!!!

面试被问了几百遍的 IOC 和 AOP &#xff0c;一篇文章带你搞清楚&#xff01;&#xff01;&#xff01; 这篇文章会从下面从以下几个问题展开对 IoC & AOP 的解释 什么是 IoC&#xff1f;IoC 解决了什么问题&#xff1f;IoC 和 DI 的区别&#xff1f;什么是 AOP&#xff…

LeetCode206链表反转

//我来理解一下运用递归求解 class Solution { public:ListNode* reverseList(ListNode* head) {//首先判断是否为最后一个元素if(head null|| head.next null){return head;//返回末尾元素}ListNode* receive;//此时进入循环的每一层都实现了temp接收head.next的结点进行…

解决sublime中文符号乱码问题

效果图 原来 后来 问题不是出自encode文件编码&#xff0c;而是win10的字体问题。 解决方法 配置&#xff1a; { "font_face":"Microsoft Yahei", "dpi_scale": 1.0 } 参考自 Sublime 输入中文显示方框问号乱码_sublime中文问号-CSDN博…

Python新年烟花代码

Pygame 绘制烟花的基本原理 1&#xff0c;发射阶段&#xff1a;在这一阶段烟花的形状是线性向上&#xff0c;通过设定一组大小不同、颜色不同的点来模拟“向上发射” 的运动运动&#xff0c;运动过程中 5个点被赋予不同大小的加速度&#xff0c;随着时间推移&#xff0c;后面的…

LeGO-LOAM 安装以及运行

一、源码地址&#xff1a; GitHub - RobustFieldAutonomyLab/LeGO-LOAM: LeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable TerrainLeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain - GitH…

报错解决:Error creating bean with name ‘userServiceImpl‘

首先&#xff1a;spring整合MyBatis是出现这个错误&#xff1a; Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name userServiceImpl: Unsatisfied dependency expressed through fiel…