讲师中心 微信公众号
AI工具推荐 视频效率加速

SnowUUID 简介:受 Snowflake 启发的分布式 UUID 生成器

陌丽姑娘_3727

陌丽姑娘_3727

发布时间:2024-11-04 13:51:32

|

1180人浏览过

|

来源于dev.to

转载

在分布式系统中,确保跨多个服务器或进程的唯一 id 可能具有挑战性。 id 必须是唯一的、快速生成的,并且有时还传达有关其来源的信息。受 twitter 的 snowflake id 生成算法的启发,我开发了 snowuuid,这是一个专为 node.js 应用程序设计的分布式 uuid 生成器。 snowuuid 结合了精度和可扩展性,生成独特的、按时间排序的标识符,可以针对任何分布式设置进行自定义。

为什么选择 snowuuid?

snowuuid 将 twitter snowflake 算法的强大功能融入到一个紧凑、易于使用的 npm 包中,供 javascript 开发人员使用。 snowuuid 生成的每个 id 都是 64 位整数,包含有关时间戳、数据中心、worker 和序列的信息,非常适合每个服务器或进程独立生成 id 的分布式应用程序。

SnowUUID 简介:受 Snowflake 启发的分布式 UUID 生成器

snowuuid的特点

  • 时间顺序 id:id 按时间顺序生成,确保它们可以按时间顺序排序。
  • 自定义选项:snowuuid 允许配置数据中心和工作人员 id,支持跨分布式系统的不同设置。
  • 高吞吐量:snowuuid 具有每毫秒的序列限制,可以处理高吞吐量要求,防止 id 冲突。

snowuuid 的工作原理

snowuuid id 由多个段组成:

  1. 时间戳:确保 id 按时间顺序排列。
  2. 数据中心id:区分不同的数据中心。
  3. 工作人员 id:区分数据中心内的不同工作人员。
  4. 序列:确保可以在同一毫秒内创建多个唯一id。

以下是每个段的位分布细分:

segment bits allocated
timestamp 41 bits
datacenter id 5 bits
worker id 5 bits
sequence number 12 bits

用法

从 npm 安装 snowuuid:

Conventional Git
Conventional Git

Conventional Commits v1.0.0 分支、工作树命名及提交信息规范,适用于 GitHub 与 GitLab 项目,用于创建分支和命名工作树等场景。

下载
npm install snowuuid

要使用 snowuuid 生成唯一 id,请导入包并初始化新实例:

const { snowuuid } = require('snowuuid');

// initialize snowuuid with options
const generator = new snowuuid({
    epoch: 1609459200000n,  // starting from january 1, 2021
    workerid: 1n,           // unique id for each worker
    datacenterid: 1n        // unique id for each datacenter
});

// generate a unique id
const uniqueid = generator.nextid();
console.log(uniqueid.tostring());

自定义snowuuid

snowuuid 的 workeroptions 界面提供可自定义的设置以适应您的系统:

  • 纪元:自定义开始时间(以毫秒为单位)。
  • workerid:数据中心内每个工作人员的唯一标识符。
  • datacenterid:每个数据中心的唯一标识符。
const generator = new snowuuid({
    epoch: 1610000000000n,  // custom epoch
    workerid: 3n,           // worker id
    datacenterid: 2n        // datacenter id
});

底层:代码

snowuuid 的核心是 nextid() 函数,它通过组合时间戳、数据中心 id、工作 id 和序列位来生成唯一 id。其工作原理如下:

  • 时钟处理:该算法确保系统时钟始终向前移动。如果时钟倒退,则会抛出错误以防止重复 id。
  • 序列溢出处理:当一毫秒内达到序列限制时,snowuuid 会等待下一毫秒继续生成 id。

示例代码:nextid 函数

nextId() {
    let timestamp = SnowUUID.now();

    if (timestamp < this.#lastTimestamp) {
        throw new Error(
            `Clock moved backwards. Unable to generate ID for ${this.#lastTimestamp - timestamp} milliseconds.`
        );
    }

    if (timestamp === this.#lastTimestamp) {
        this.#sequence = (this.#sequence + 1n) & SEQUENCE_MASK;
        if (this.#sequence === 0n) {
            timestamp = this.tilNextMillis(this.#lastTimestamp);
        }
    } else {
        this.#sequence = 0n;
    }

    this.#lastTimestamp = timestamp;

    return (
        ((timestamp - this.#epoch) << DEFAULT_TIMESTAMP_LEFT_SHIFT) |
        (this.#datacenterId << DEFAULT_DATACENTER_ID_SHIFT) |
        (this.#workerId << DEFAULT_WORKER_ID_SHIFT) |
        this.#sequence
    );
}

结论

snowuuid 为分布式 uuid 生成提供了强大、可定制且高效的解决方案,非常适合需要跨多个系统的高可扩展性和唯一 id 的应用程序。无论是用于分析、消息传递还是微服务,snowuuid 都能确保唯一的、按时间排序的标识符,帮助您充满信心地进行扩展。

在 github 上探索 snowuuid:snowuuid 存储库

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

1893

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

2574

2023.10.07

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

11380

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

963

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

6830

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

2682

2025.08.07

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

3816

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1215

2023.07.28

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

60

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
vscode手册
vscode手册

共0课时 | 0人学习

Git 教程
Git 教程

共21课时 | 7.9万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn