当前位置: 首页 > news >正文

为什么需要分布式 ID?

目录

为什么需要分布式 ID

分布式 ID 的生成方法

分布式 ID 的应用场景

小结


在现代软件架构中,分布式系统架构变得越来越流行。在这些系统中,由于组件分散在不同的服务器、数据中心甚至不同的地理位置,因此要构建高性能、可扩展的应用系统就需要一种可靠的方式来确保在整个系统中生成的 ID 是唯一的。

文章持续更新中,微信搜索【路多辛】优质文章

为什么需要分布式 ID

在单体系统中,生成唯一 ID 相对简单,因为所有操作通常都在同一数据库或同一应用程序上下文中进行,可以依赖数据库的自增主键或者应用程序的内部计数器来生成唯一标识符。然而,当系统扩展到分布式架构时,这种方法就不再可行了。因为分布式系统对 ID 的要求有如下特点:

  1. 全局唯一性:分布式系统由多个节点组成,每个节点都可能需要生成唯一标识符。在这种情况下,需要一种机制来确保在全局范围内生成的每个标识符都是唯一的,以避免冲突。
  2. 无中心化:分布式系统没有中心化的控制点,因此无法从一个中心点生成全局唯一 ID。每个节点必须能够独立生成唯一 ID。
  3. 高并发性:分布式系统通常需要支持高并发请求,单一的ID生成点可能会成为性能瓶颈。分布式 ID 生成可以分散请求,提高系统的吞吐量。
  4. 故障隔离:在分布式系统中,单个节点可能会出现故障。如果 ID 生成依赖于单个节点,那么该节点的故障可能会导致整个系统无法生成新的 ID。分布式 ID 生成可以使系统在节点故障时仍能继续生成 ID。
  5. 跨网络和地理边界:分布式系统可能跨越多个网络和地理位置。在这种情况下,需要一种机制来在全球范围内生成唯一 ID。

分布式 ID 的生成方法

  • UUID(Universally Unique Identifier)

UUID 是一种广泛使用的分布式 ID 生成方法。它是一个128位长的数字,通常以36个字符(包括4个破折号)表示的字符串形式存在。UUID 的优点是易于生成,并且概率上可以保证全局唯一。但是,UUID 并不提供顺序性,并且由于其长度,它在存储和检索时可能不如其他方法高效。

  • 数据库自增 ID 与应用层批量获取

一种简单的方法是依旧使用数据库的自增 ID,但结合应用层的策略来获取这些 ID。例如,每个应用实例可以批量获取一定范围的 ID,然后在本地分配这些 ID 给需要的对象。这种方法降低了对数据库的依赖,提高了性能,但可能在应用重启时导致 ID 的浪费。

  • 基于时间戳的方法

一种常见的策略是使用当前的时间戳来生成 ID 的一部分。Twitter 的 Snowflake 算法就是一个例子,它生成一个64位的 ID,其中包括时间戳、数据中心 ID、机器 ID 和一个序列号。这种方法可以生成带有顺序性的 ID,并且性能很好。但是,依赖于系统时钟,需要处理时钟同步的问题。

  • 分布式序列生成器

可以使用分布式缓存(如 Redis)或者一致性协议(如 ZooKeeper)来生成序列号。这些系统可以在多个节点之间同步序列号,保证 ID 的唯一性和顺序性。这种方法的缺点是可能会受到底层系统的性能和可用性的影响。

  • 基于区块链的方法

区块链技术提供了一种去中心化的方式来生成和验证唯一性。在区块链中生成的 ID 可以保证是全局唯一的,并且由于其不可变性,这些 ID 也是可验证的。然而,这种方法可能会因为区块链的性能限制而不适合所有场景。

分布式 ID 的应用场景

  1. 用户 ID,在分布式系统中,每个用户都需要一个唯一的 ID 来标识其身份。通过分布式 ID 生成器生成的用户 ID 可以确保全局唯一,且便于在各个节点之间进行身份验证和数据查询。
  2. 订单 ID,订单 ID 是用于标识订单的唯一标识符。在分布式系统中,通过分布式 ID 生成器生成的订单 ID 可以确保全局唯一,便于订单的查询、统计和分析。
  3. 商品 ID,商品 ID 是用于标识商品的唯一标识符。在分布式系统中,通过分布式 ID 生成器生成的商品 ID 可以确保全局唯一,便于商品的查询、统计和分析。
  4. 消息 ID,在分布式系统中,消息 ID 是用于标识消息的唯一标识符。通过分布式 ID 生成器生成的消息 ID 可以确保全局唯一,便于消息的查询、统计和分析。

小结

分布式 ID 是分布式系统设计的关键一环,不仅关乎数据的一致性和完整性,还直接影响到系统的性能和扩展性。从传统的数据库自增 ID,到基于分布式协调服务的方案,再到如Snowflake 这样高度优化的算法,技术在不断演进以适应更复杂的业务需求。理解不同方案的优缺点,结合实际应用场景进行灵活选择和适当优化,是构建高性能分布式系统的重要步骤。随着技术的发展,我们可能会看到新的分布式ID生成方法的出现,以应对不断增长的系统规模和复杂性。

文章持续更新中,微信搜索【路多辛】优质文章

相关文章:

为什么需要分布式 ID?

目录 为什么需要分布式 ID 分布式 ID 的生成方法 分布式 ID 的应用场景 小结 在现代软件架构中,分布式系统架构变得越来越流行。在这些系统中,由于组件分散在不同的服务器、数据中心甚至不同的地理位置,因此要构建高性能、可扩展的应用系…...

MIT6.828 Lab2-3 Sysinfo

目录 一、实验内容二、实验过程2.1 已有的代码2.2 需补充内容/kernel/kalloc.c修改(剩余内存计算的函数)/kernel/proc.c修改(统计进程数量的函数)/kernel/defs.h修改添加/kernel/sysinfo.c文件/kernel/syscall.h修改/kernel/sysca…...

形态学操作:腐蚀、膨胀、开闭运算、顶帽底帽变换、形态学梯度区别与联系

一、总述相关概念 二、相关问题 1.形态学操作中的腐蚀和膨胀对图像有哪些影响? 形态学操作中的腐蚀和膨胀是两种常见的图像处理技术,它们通过对图像进行局部区域的像素值替换来实现对图像形状的修改。 腐蚀操作通常用于去除图像中的噪声和细小的细节&a…...

StringBufferInputStream类,你学会了吗?

在Java编程中,处理字符串数据流是一项常见的任务。 为了更灵活地处理字符串数据流,Java提供了StringBufferInputStream类,它允许将字符串转换为输入流,从而可以像处理其他输入流一样对字符串进行操作。 本文将深入探讨StringBufferInputStream类的背景、用法、优缺点以及…...

06_Tomcat

文章目录 Tomcat1.概念2.Tomcat安装3.Tomcat项目结构4.标准web项目结构5.Tomcat部署项目方式6.IDEA关联Tomcat6.1 构建tomcat和idea关联6.2 使用idea创建一个Javaweb工程6.3 使用idea将工程**构建**成一个app6.4 使用idea将构建好的app**部署**到tomcat中 Tomcat 1.概念 Tomc…...

系统安全扫描扫出了:可能存在 CSRF 攻击怎么办

公司的H5在软件安全测试中被检查出可能存在 CSRF 攻击,网上找了一堆解决方法,最后用这种方式解决了。 1、问题描述 CSRF 是 Cross Site Request Forgery的缩写(也缩写为也就是在用户会话下对某个 CGI 做一些 GET/POST 的事,RIVTSTCNNARGO一这…...

Android ART 虚拟机简析

源码基于:Android U 1. prop 名称选项名称heap 变量名称功能 dalvik.vm.heapstartsize MemoryInitialSize initial_heap_size_ 虚拟机在启动时,向系统申请的起始内存 dalvik.vm.heapgrowthlimit HeapGrowthLimit growth_limit_ 应用可使用的 max…...

Android低代码开发 - MenuPanel的源码剖析和基本使用

看了我上篇文章Android低代码开发 - 像启蒙和乐高玩具一样的MenuPanel 之后,本篇开始讲解代码。 源代码剖析 首先从MenuPanelItemRoot讲起。 package dora.widget.panelinterface MenuPanelItemRoot {/*** 菜单的标题。** return*/var title: String?fun hasTit…...

Leetcode刷题笔记3

18. 四数之和 18. 四数之和 - 力扣(LeetCode) 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应&…...

初识C语言——第二十九天

数组 本章重点 1.一维数组的创建和初始化 数组的创建 注意事项: 1.一维由低数组在内存中是连续存放的! 2.随着数组下标的增长,地址是由低到高变化的 2.二维数组的创建和初始化 注意事项: 1.二维数组在内存中也是连续存放的&am…...

LeetCode27.移除元素

题目链接: 27. 移除元素 - 力扣(LeetCode) 思路分析:同样属于经典的双指针移动问题,要掌握固定的思路即可。 算法分析:这个题目可以这样处理,我们把所有非val 的元素都向前移动,把…...

DiffMap:首个利用LDM来增强高精地图构建的网络

论文标题: DiffMap: Enhancing Map Segmentation with Map Prior Using Diffusion Model 论文作者: Peijin Jia, Tuopu Wen, Ziang Luo, Mengmeng Yang, Kun Jiang, Zhiquan Lei, Xuewei Tang, Ziyuan Liu, Le Cui, Kehua Sheng, Bo Zhang, Diange Ya…...

ComfyUI简单介绍

🍓什么是ComfyUI ComfyUI是一个为Stable Diffusion专门设计的基于节点的图形用户界面,可以通过各种不同的节点快速搭建自己的绘图工作流程。 软件打开之后是长这个样子: 同时软件本身是github上的一个开源项目,开源地址为&#…...

【内存泄漏Bug】animation未释放

问题描述 一个页面做了动画特效,这个页面有可能跳转到其他页面,并长时间不返回,该页面此时已经不活跃了,该页面的对象为无用对象,存在内存泄漏风险 问题分析 这个activity的特性是 1. 有可能跳转到其他页面 2. 有可…...

《异常检测——从经典算法到深度学习》28 UNRAVEL ANOMALIES:基于周期与趋势分解的时间序列异常检测端到端方法

《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …...

Python正则模块re方法介绍

Python 的 re 模块提供了多种方法来处理正则表达式。以下是一些常用的方法及其功能介绍: 1. re.match() 在字符串的开始位置进行匹配。 import repattern r\d string "123abc456"match re.match(pattern, string) if match:print(f"匹配的字符…...

pdf使用pdfbox切割pdf文件MultipartFile

引入依赖&#xff1a; <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.25</version></dependency>测试代码&#xff1a; import io.choerodon.core.iam.ResourceLevel; impo…...

力扣HOT100 - 31. 下一个排列

解题思路&#xff1a; 数字是逐步增大的 步骤如下&#xff1a; class Solution {public void nextPermutation(int[] nums) {int i nums.length - 2;while (i > 0 && nums[i] > nums[i 1]) i--;if (i > 0) {int j nums.length - 1;while (j > 0 &&…...

设计模式 20 中介者模式 Mediator Pattern

设计模式 20 中介者模式 Mediator Pattern 1.定义 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;它通过封装对象之间的交互&#xff0c;促进对象之间的解耦合。中介者模式的核心思想是引入一个中介者对象&#xff0c;将系统中对象之间…...

在 C++ 中,p->name 和 p.name 的效果并不相同。它们用于不同的情况,取决于你是否通过指针访问结构体成员。

p->name&#xff1a;这是指针访问运算符&#xff08;箭头运算符&#xff09;。当 p 是一个指向结构体的指针时&#xff0c;用 p->name 来访问结构体的成员。 student* p &stu; // p 是一个指向 student 类型的指针 cout << p->name << endl; // 通过…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...