首页 > 其他分享 >第四章 全局唯一ID生成

第四章 全局唯一ID生成

时间:2024-10-14 17:46:48浏览次数:3  
标签:ID 随机 序列 序列号 生成 全局 第四章 时钟

聊聊支付那些事系列

第一章 什么是支付

第二章 支付的一方、‌二方、‌三方、‌四方

第三章 三方支付


目录

从前几章的介绍我们知道,要搭建一个支付系统中有订单、支付单、账单等等会使用到很多的单号,那我们单号怎么生成呢。本章我们来聊一聊这个问题。

大家好!在前面的章节中,我们已经深入了解了支付系统的构建,涉及到了订单、支付单、账单等多个核心组件。在这个过程中,我们不难发现,单号作为贯穿整个支付流程的关键标识,其生成与管理显得尤为重要。那么,今天我们就来专门探讨一下单号生成的问题,看看如何科学、高效地生成和管理这些单号。让我们开始吧!

思考

我们先来思考一下,我们对于这个生成器的诉求是什么
1、生成的值不重复
2、能够一直用不会挂
3、能够在扛得住系统压力 例如 【100W/S 5ms以内】
4、简单、好用
5、足够随机、不会被推测

抽象标准化要求

1、全局唯一
2、可以支持三高场景:高可用、高性能、高并发
4、接入简单

如何实现

现有多种方式对比

暂时省略。。。

雪花算法思路

  1. 分段:将不同含义的数据整合成一个uuid值
业务场景时间戳实例号。。。 扩展随机序列号
SYTDD(不同业务场景可以重复)2024090912121200010000

实例号和随机序列号长度可根据实际业务调整。

  1. 本地化
    实际生成uuid的时候 可以支持系统运行时仅仅本地生成,不强依赖中心化服务。
    本地随机数位数:能保证单位时钟内单机支持的最大量级 0000-9999-0000 也就是说单机每秒可以支持1W的调用,实际使用时看业务使用情况来定。
    无特殊诉求支持默认的生成序列 如果同系统中不同场景需要隔离序列,那可以提供多个生成序列,每个序列化支持一个时钟周期数据,用hash来记录序列随机初始值和序列对应的前置值。就能保证序列内数据唯一

需要的数据结构 三个hash存储数据
序列名:序列号
序列名:序列前缀
序列名:随机初始序列号

伪代码

lock
	序列名前缀存在   序列名:序列前缀   
		拿出序列化++
		序列号==随机初始序列号
			本地周期号用完
		序列号覆盖原有值 写 序列名:序列号  
	序列名前缀不存在
		重置生产随机序列号
		写 序列名:序列号  序列名:序列前缀   序列名:随机初始序列号
unlock
return  前缀+序列号
  1. 管理实例号
    从第一步分析可以得出,业务场景可以生成时指定、时间戳使用机器时钟即可、随机数本地保证单位时钟内不重复就行了。
    所以我们需要一个实例号统一管理,来保证不具备相同的实例,这样就能保证了全局的唯一

支持接入方式

中心化uuid生成
本地化uuid生产

使用jar包接入
指定实例管理中心、接入环境、接入应用
容器启动实例化完成后 提供一个默认方法直接生成uuid,和调用本地方法区别不大

问题

  1. 生成的uuid在分库分表的场景上怎么保证分配不均的问题
    解答:这个说的也就是随机率的问题,如果我们的数据随机率足够大,那理论上来说一般是不会出现分布不均的问题,那么这个时候,实际就是看后面几位随机数全局上怎么保证随机率的问题
    一般不建议本地随机真的是完全随机,因为我们要保证的是单位时间内是不能重复的。
    建议:单位时钟内随机生成一个初始值,然后依次+1,从000-999内部循环,同时记录单位时钟内生成次数不能超过随机数最大阈值。 这样在有分库分表诉求的大流量下也基本上可以保证数据的随机率。

  2. 为什么常见的UUID19位的居多
    全局唯一ID之所以多为19位,主要归功于‌雪花算法(Snowflake)‌的广泛应用。该算法生成的是一个64位的Long型数字,作为全局唯一ID,其在分布式系统中表现出色。具体来说:
    唯一性‌:雪花算法通过结合时间戳、机器ID和序列号,确保了ID的唯一性。
    ‌高性能‌:算法设计使得ID生成过程高效,能够满足高并发场景下的需求。
    ‌趋势递增‌:生成的ID趋势递增,有利于数据库存储和索引。
    在实际应用中,如MySQL数据库,通常使用bigint类型来存储这64位的ID,而bigint类型的长度为20位,其中19位用于存储实际ID值,剩余1位可能用于其他目的或作为标识。因此,全局唯一ID多为19位的现象,主要源于雪花算法在分布式系统中的广泛应用及其生成的ID特性

  3. 时钟回拨问题怎么解决
    这个问题的解决方式有很多种。我个人建议以下两种方式相结合来处理
    本地时钟回拨缓存‌:
    记录上一次生成ID的时间戳,当检测到时钟回拨时,使用缓存的时间戳代替当前时间戳生成ID。‌
    使用NTP协议同步时间‌:
    通过与NTP服务器同步时间,确保服务器时间准确无误,从而避免时钟回拨问题。‌

未完待续

标签:ID,随机,序列,序列号,生成,全局,第四章,时钟
From: https://blog.csdn.net/xupeng874395012/article/details/142464202

相关文章

  • 【uniapp】video在公众号自动播放事件及使用object-fit使内容填充不留黑边
     视频组件官网:https://uniapp.dcloud.net.cn/component/video.html使用object-fit使内容填充不留黑边object-fitcontain当视频大小与video容器大小不一致时,视频的表现形式。contain:包含,fill:填充,cover:覆盖 在template中添加<template><view......
  • Squid代理服务器搭建和简单使用
    1Squid的介绍1.1前言简介代理服务器(ProxyServer)的功能是代理网络用户去取得网络信息。形象地说,它是网络信息的中转站,是个人网络和Internet服务商之间的中间代理机构,负责转发合法的网络信息,对转发进行控制和登记。[1]代理服务器作为连接Internet与Intranet的桥梁,在实际应用......
  • 在 Android 开发中,如何实现蓝牙连接设备?
    在Android开发中,实现蓝牙连接设备通常通过BluetoothAdapter、BluetoothDevice、BluetoothSocket等类来实现。你可以使用这些API来搜索蓝牙设备、配对设备以及通过蓝牙进行通信。以下是实现蓝牙连接设备的详细步骤,包含设备扫描、连接以及数据传输的Java代码示例。1.......
  • Android Studio开发系统APK(引入framework.jar及系统签名)
    在开发过程中,我们需要开发一些功能的独立APK,当然某些简单的功能可以依附于Settings或SystemUI等系统有源码的APK,但是一些逻辑功能较为复杂的APK用AndroidStudio开发就比较的好一点。一、新建项目新建如MyDemo一定要选择EmptyViewsActivity,只有这个才是干净的用java/ko......
  • HivisionIDPhotos 开源精美证件照
    马上就该考研啦,还在用某x、某xxx做证件照吗?也就用一次还得花几块钱买个会员,别当冤大头啦!最近1个月一个颠覆性的开源产品稳站GitHub榜前三,没错!他就是hivisionidphotos。博士团队开源项目,只能说太强!项目链接:https://github.com/Zeyi-Lin/HivisionIDPhotos短短1个月,竟然有1......
  • pyaudio无法使用sudo执行:OSError: [Errno -9996] Invalid input device (no default o
    项目背景在树莓派上通过语音控制ws2812b灯带,使用 pyaudio 作为语音输入,使用 rpi_ws281x 控制灯带的颜色。问题描述目前出现的问题是由于rpi_ws281x使用PWM引脚,需要使用sudo来执行,但是pyaudio使用sudo执行时会报错:OSError:[Errno-9996]Invalidinputdevice(no......
  • aardio入门到精通06-常量、成员常量、全局常量、常量函数
    常量、成员常量、全局常量、常量函数importconsole;//常量、全局常量、常量函数(库函数)//主要内容:常量的特性、不同类型的常量(字面常量、成员常量、全局常量)以及它们的使用场景。如何将普通变量转换为全局常量,以及全局常量在API函数中的应用。//一、常量://1-1常量......
  • android开发修复第三方库生成的so库名称不是以so结尾的解决方法
    需要ubuntu安装patchelf软件:sudoapt-getinstallpatchelf1.先使用readelf-d查看so内容结构先使用readelf-dlibpsl.so.5.3.5查看libpsl.so.5.3.5库类型是NEEDED和SONAME的对应的名称是不是以.so结尾的,比如下面的图,libc.so的名称是以.so结尾的我们就不用管,libpsl.so.5不......
  • DIY Matter Bridge 和智能锁简单联动的实践
    一.写在前面在之前的博客文章《基于乐鑫ESP32-C3的MatterLight实践》中,我们利用乐鑫的硬件和SDK方案实现了简单的Light例程,并对Matter协议进行了简要介绍。在开始本篇文章之前,我还是打算重新聊一聊Matter,顺便谈谈自己对它的理解,这也能说明为何这段时间我一直执着于......
  • Android内容观察者(案例:监听数据库+代码+效果图)
    目录1.内容观察者概念1.什么是ContentObserver?2.主要方法3.使用场景4.工作原理5.注册和注销6.实现步骤7.注意事项2.创建内容观察者3.注册内容观察者4.取消注册内容观察者5.完整的activity代码6.案例:检测数据库1)创建一个Android​编辑2)创建数据库3......