谈谈分布式 ID 的服务实践

谈谈分布式系统中的唯一ID生成 我们目前主流的服务端系统都是分布式的架构。业务分布在不同的机器节点上产生数据,数据也存储在不同的机器节点。为了方便标识数据,我们使用唯一且有序的ID来标识数据。整个分布式系统中,新生成的ID永远不会产生与之前已经生成的ID重复;生成的所有ID可以根据生成的时间进行排序(生成时间晚的排序顺序靠后)我们来看一下市面上的几种主流的ID生成方案。特性/方案Mysql 集群ID数据库雪花算法唯一性按照生成时间的有序性:x::x::x:维护的难易程度难较难易维护易维护。 阅读详情

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

bfd3d6711b4b6ecbb4044fbf13ab793c.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:

  • Boot 地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 地址:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

来源:vivo互联网技术


本文介绍了什么是分布式ID,分布式ID的业务场景以及9种分布式ID的实现方式,同时基于vivo内部IT的业务场景,介绍了自研鲁班分布式ID服务的实践。

一、方案背景

1.1 分布式ID应用的场景

随着系统的业务场景复杂化、架构方案的优化演进,我们在克服问题的过程中,也总会延伸出新的技术诉求。分布式ID也是诞生于这样的IT发展过程中,在不同的关联模块内,我们需要一个全局唯一的ID来让模块既能并行地解耦运转,也能轻松地进行整合处理。以下,首先让我们一起回顾这些典型的分布式ID场景。

1.1.1 系统分库分表

随着系统的持续运作,常规的单库单表 在支撑更高规模的数量级时,无论是在性能或稳定性上都已经难以为继,需要我们对目标逻辑数据表进行合理的物理拆分,这些同一业务表数据的拆分,需要有一套完整的 ID生成方案来保证拆分后的各物理表中同一业务ID不相冲突,并能在后续的合并分析中可以方便快捷地计算。

以公司的营销系统的订单为例,当前不但以分销与零售的目标组织区别来进行分库存储,来实现多租户的数据隔离,并且会以订单的业务属性(订货单、退货单、调拔单等等)来进一步分拆订单数据 。在订单创建的时候,根据这些规则去构造全局唯一ID,创建订单单据并保存在对应的数据库中;在通过订单号查询时,通过ID的规则,快速路由到对应的库表中查询;在BI数仓的统计业务里,又需要汇总这些订单数据进行报表分析。

1.1.2 系统多活部署

无论是面对着全球化的各国数据合规诉求 ,还是针对容灾高可用的架构设计 ,我们都会对同一套系统进行多活部署。多活部署架构的各单元化服务,存储的单据(如订单/出入库单/支付单等)均带有部署区域属性的ID结构去构成全局唯一ID,创建单据并保存在对应单元的数据库中,在前端根据单据号查询的场景,通过ID的规则,可快速路由到对应的单元区域进行查询。对应多活部署架构的中心化服务,同步各单元的单据数据时,单据的ID是全局唯一,避免了汇聚数据时的ID冲突。

在公司的系统部署中,公共领域的 BPM 、待办、营销领域的系统都大范围地实施多活部署。

1.1.3 链路跟踪技术

在微服务架构流行的大背景下,此类微服务的应用对比单体应用的调用链路会更长、更复杂,对问题的排查带来了挑战,应对该场景的解决方案,会在流量入口处产生全局唯一的TraceID,并在各微服务之间进行透传,进行流量染色与关联,后续通过该全局唯一的TraceID ,可快速地查询与关联全链路的调用关系与状态,快速定位根因问题。

在公司的各式各样的监控系统、灰度管理平台、跨进程链路日志中,都会伴随着这么一个技术组件进行支撑服务。

1.2 分布式ID核心的难点

  • 唯一性 : 保持生成的ID全局唯一,在任何情况下也不会出现重复的值(如防止时间回拔,时钟周期问题)。

  • 高性能 : ID的需求场景多,中心化生成组件后,需要高并发处理,以接近 0ms的响应大规模并发执行。

  • 高可用 : 作为ID的生产源头,需要100%可用,当接入的业务系统多的时候,很难调整出各方都可接受的停机发布窗口,只能接受无损发布。

  • 易接入 : 作为逻辑上简单的分布式ID要推广使用,必须强调开箱即用,容易上手。

  • 规律性 : 不同业务场景生成的ID有其特征,例如有固定的前后缀,固定的位数,这些都需要配置化管理。

1.3 分布式ID常见的方案

常用系统设计中主要有下图9种ID生成的方式:

f01e3042e786cfb7ad8bc876878d82d1.png 190dadb1cea06150411ad1683abd3780.png

1.4 分布式ID鲁班的方案

我们的系统跨越了公共、生产制造、营销、供应链、财经 等多个领域。在分布式ID诉求下还有如下的特点 :

  • 在业务场景上除了常规的Long类型 ID,也需要支持“String类型 ”、“MixId类型 ”(后详述)等多种类型的ID生成,每一种类型也需要支持不同的长度的ID。

  • 在ID的构成规则上需要涵盖如操作类型、区域 、代理 等业务属性的标识;需要集中式的配置管理。

  • 在一些特定的业务上,基于安全的考虑,还需要在尾部加上随机数来保证ID不能被轻易猜测。

综合参考了业界优秀的开源组件与常用方案均不能满足,为了统一管理这类基础技术组件的诉求,我们选择基于公司业务场景自研一套分布式ID服务:鲁班分布式ID服务 。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

二、系统架构

e0c77cedef06c6b5a2d996ced48e2e13.png

2.1 架构说明

650f7a64899fea8c3101d5e59e673bb7.png

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

三、 设计要点

3.1 支持多种类型的ID规则

目前鲁班分布式ID服务共提供"Long类型 "、“String类型 ”、“MixId类型 ”等三种主要类型的ID,相关ID构成规则与说明如下:

3.1.2 Long类型

(1)构成规则

静态结构由以下三部分数据组成,组成部分共19位 :

  • 固定部分(4位) :

    由FixPart+ServerPart组成。

    ① FixPart(4位) :由大区zone 1位/代理 agent 1位/项目 project 1位/应用 app 1位,组成的4位数字编码。

    ② ServerPart(4位) :用于定义产生全局ID的服务器标识位,服务节点部署时动态分配。

  • 动态部分DynPart(13位) :

    System.currentTimeMillis()-固定配置时间的TimeMillis (可满足使用100年)。

  • 自增部分SelfIncreasePart(2位) :用于在全局ID的客户端SDK内部自增部分,由客户端SDK控制,业务接入方无感知。共 2位组成。

(2)降级机制

主要自增部分在服务器获取初始值后,由客户端SDK维护,直到自增99后再次访问服务端获取下一轮新的ID以减少服务端交互频率,提升性能,服务端获取失败后抛出异常,接入业务侧需介入进行处理。

(3)样例说明

8fe1dcf234f8c82b5733347f7c273c82.png

3.1.2 String类型

(1)构成规则

静态结构由以下五部分数据组成,组成部分共25~27位 :

  • 固定部分操作位op+FixPart(9~11位) :

    ① 操作位op(2~4位) :2~4位由业务方传入的业务类型标识字符。

    ② FixPart(7位) :业务接入时申请获取,由大区zone 1位,代理 agent 2位,项目 project 2位,应用 app 2位组成。

  • 服务器标识部分 ServerPart(1位) : 用于定义产生全局ID的服务器标识位,服务节点部署时动态分配A~Z编码。

  • 动态部分DynPart(9位) :

    System.currentTimeMillis()-固定配置时间的TimeMillis ,再转换为32进制字符串(可满足使用100年)。

  • 自增部分SelfIncreasePart(3位) :用于在全局ID的客户端SDK内部自增部分,由客户端SDK控制,业务接入方无感知。

  • 随机部分secureRandomPart(3位) :用于在全局ID的客户端SDK的随机部分,由SecureRandom随机生成3位0-9,A-Z字母数字组合的安全随机数,业务接入方无感知。

(2)降级机制

主要自增部分由客户端SDK内部维护,一般情况下只使用001–999 共999个全局ID。也就是每向服务器请求一次,都在客户端内可以自动维护999个唯一的全局ID。特殊情况下在访问服务器连接出问题的时候,可以使用带字符的自增来做服务器降级处理,使用产生00A, 00B... 0A0, 0A1,0A2....ZZZ. 共有36 * 36 * 36 - 1000 (999纯数字,000不用)**= 45656个降级使用的全局ID** 。

(3)样例说明

6ee63af01bd58514869019a19d9467f8.png

3.1.3 MixId类型

(1)构成规则

静态结构由以下三部分数据组成,组成部分共17位 :

  • 固定部分FixPart(4~6位) :

    ① 操作位op(2~4位) :2~4位由业务方传入的业务类型标识字符

    ② FixPart(2位) :业务接入时申请获取由代理 agent 2位组成。

  • 动态部分DynPart(6位) : 生成ID的时间,年(2位)月(2位)日(2位)。

  • 自增部分SelfIncreasePart(7位) :用于在全局ID的客户端SDK内部自增部分,由客户端SDK控制,业务接入方无感知。

(2)降级机制

无,每次ID产生均需到服务端请求获取,服务端获取失败后抛出异常,接入业务侧需介入进行处理。

(3)样例说明

83974469ac8eee6f8012e8feb6e974e0.png

3.2 业务自定义ID规则实现

鲁班分布式ID服务内置“Long类型”,“String类型”,“MixId类型”等三种长度与规则固定的ID生成算法,除以上三种类型的ID生成算法外,业务侧往往有自定义ID长度与规则的场景诉求,在鲁班分布式ID服务内置ID生成算法未能满足业务场景时,为了能在该场景快速支持业务,鲁班分布式ID服务提供了业务自定义接口并通过SPI机制在服务运行时动态加载,以实现业务自定义ID生成算法场景的支持,相关能力的实现设计与接入流程 如下:

(1)ID的构成部分主要分FixPart、DynPart、SelfIncreasePart三个部分。

(2)鲁班分布式ID服务的客户端SDK提供

LuBanGlobalIDClient的接口与getGlobalId(...)/ setFixPart(...)/setDynPart(...)/setSelfIncreasePart(...)等四个接口方法 。

(3)业务侧实现LuBanGlobalIDClient接口内的4个方法,通过SPI机制在业务侧服务进行加载,并向外暴露出HTTP或DUBBO协议的接口。

(4)用户在鲁班分布式ID服务管理后台对自定义ID生成算法的类型名称与服务地址信息进行配置,并关联需要使用的AK接入信息。

(5)业务侧使用时调用客户端SDK提供的LuBanGlobalIDClient的接口与getGlobalId方法,并传入ID生成算法类型与IdRequest入参对象,鲁班分布式ID服务接收请求后,动态识别与路由到对应ID生产算法的实现服务,并构建对象的ID返回给客户端,完成整个ID生成与获取的过程。

3.3 保证ID生成不重复方案

1a28c5ce6c19fc39431b6149f4be04eb.png

3.4 ID服务无状态无损管理

服务部署的环境在虚拟机上,ip是固定,常规的做法是在配置表里配置ip与机器码的绑定关系(这样在服务扩缩容的时候就需要人为介入操作,存在一定的遗漏配置风险,也带来了一定的运维成本),但在容器的部署场景,因为每次部署时IP均是动态变化的,以前通过配置表里ip与机器码的映射关系的配置实现方式显然不能满足运行在容器场景的诉求,故在服务端设计了通过心跳上报实现机器码动态分配的机制,实现服务端节点ip与机器码动态分配、绑定的能力,达成部署自动化与无损发布的目的。

相关流程如下:

57059b2779412724deffd28f17ca6482.png

【注意】

服务端节点可能因为异常,非正常地退出,对于该场景,这里就需要有一个解绑的过程,当前实现是通过公司平台团队的分布式定时任务服务,检查持续5分钟(可配置)没有上报心跳的机器码分配节点进行数据库绑定信息清理的逻辑,重置相关机器码的位置供后续注册绑定使用。

3.5 ID使用方接入SDK设计

SDK设计主要以"接入快捷,使用简单 "的原则进行设计。

(1)接入时:

鲁班分布式ID服务提供了spring-starter包,应用只需再pom文件依赖该starter,在启动类里添加**@EnableGlobalClient** ,并配置AK/SK 等租户参数即可完成接入。

同时鲁班分布式ID服务提供Dubbo & Http的调用方式,通过在启动注解配置accessType 为HTTP/DUBBO 来确定,SDK自动加载相关依赖。

(2)使用时:

根据"Long "、"String "、"MixId "等三种id类型分别提供GlobalIdLongClient 、

GlobalIdStringClient 、GlobalIdMixIDClient 等三个客户端对象,并封装了统一的入参RequestDTO 对象,业务系统使用时只需构建对应Id类型的RequestDTO对象(支持链式构建),并调用对应id类型的客户端对象getGlobalID (GlobalBaseRequestDTO

globalBaseRequestDTO) 方法,即可完成ID的构建。

Long类型Id获取代码示例

package com.vivo.it.demo.controller;
 
import com.vivo.it.platform.luban.id.client.GlobalIdLongClient;
import com.vivo.it.platform.luban.id.dto.GlobalLongIDRequestDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
 
@RequestMapping("/globalId")
public class GlobalIdDemoController {
 
    @Autowired
    private GlobalIdLongClient globalIdLongClient;
 
    @RequestMapping("/getLongId")
    public String getLongId() {
        GlobalLongIDRequestDTO globalLongIDRequestDTO = GlobalLongIDRequestDTO.Builder()
                .setAgent("1") //代理,接入申请时确定
                .setZone("0") //大区,接入申请时确定
                .setApp("8") //应用,接入申请时确定
                .setProject("7") //项目,接入申请时确定
                .setIdNumber(2); //当次返回的id数量,只对getGlobalIDQueue有效,对getGlobalID(...)无效
        long longId = globalIdLongClient.getGlobalID(globalLongIDRequestDTO);
        return String.valueOf(longId);
    }
}

3.6 关键运行性能优化场景

3.6.1 内存使用优化

在项目上线初时,经常发生FGC,导致服务停顿,获取ID超时,经过分析,鲁班分布式ID服务的服务端主要为内存敏感的应用,当高并发请求时,过多对象进入老年代从而触发FGC,经过排查主要是JVM内存参数上线时是使用默认的,没有经过优化配置,JVM初始化的内存较少,高并发请求时JVM频繁触发内存重分配,相关的对象也流程老年代导致最终频繁发送FGC。

对于这个场景的优化思路主要是要相关内存对象在年轻代时就快速经过YGC回收,尽量少的对象进行老年代而引起FGC。

基于以上的思路主要做了以下的优化:

  • 增大JVM初始化内存(-Xms,容器场景里为-XX:InitialRAMPercentage)

  • 增大年轻代内存(-Xmn)

  • 优化代码,减少代码里临时对象的复制与创建

3.6.2 锁颗粒度优化

客户端SDK再自增值使用完或一定时间后会向服务端请求新的id生成,这个时候需要保证该次请求在多线程并发时是只请求一次,当前设计是基于用户申请ID的接入配置,组成为key,去获取对应key的对象锁,以减少同步代码块锁的粒度,避免不同接入配置去在并发去远程获取新的id时,锁粒度过大,造成线程的阻塞,从而提升在高并发场景下的性能。

四、 业务应用

当前鲁班分布式ID服务日均ID生成量亿级 ,平均RT在0~1ms 内,单节点可支持 万级 QPS,已全面应用在公司IT内部营销订单、支付单据、库存单据、履约单据、资产管理编码 等多个领域的业务场景。

五、未来规划

在可用性方面,当前鲁班分布式ID服务仍对Redis、Mysql等外部DB组件有一定的依赖(如应用接入配置信息、MixId类型自增部分ID计数器),规划在该依赖极端宕机的场景下,鲁班分布式ID服务仍能有一些降级策略,为业务提供可用的服务。

同时基于业务场景的诉求,支持标准形式的雪花算法等ID类型。

六、 回顾总结

本文通过对分布式ID的3种应用场景,实现难点以及9种分布式ID的实现方式进行介绍,并对结合vivo业务场景特性下自研的鲁班分布式id服务从系统架构,ID生成规则与部分实现源码进行介绍,希望对本文的阅读者在分布式ID的方案选型或自研提供参考。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,“长按”或“扫描”下方二维码噢:

c0ad7481092ba60cd3b3797dfe540846.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

43e87a1b39ad09b69f68e8796ec77c7e.png

148b7122c3741589309258eb4f2148ee.pngd9f7c4bd272ad7c35fea8686d0904562.pnge88a2476a2caf703cdced5ee86b3e91f.pngb09048a4fe50d212ca5c893f01d83fd4.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
九种分布式ID解决方案,总有一款适合你! Snowflake,雪花算法是有Twitter开源的分布式ID生成算法,以划分命名空间的方式将64bit位分割成了多个部分,每个部分都有具体的不同含义,在Java中64Bit位的整数是Long类型,所以在Java中Snowflake算法生成的ID就是long来存储的。利用Mysql的特性ID自增,可以达到数据唯一标识,但是分库分表后只能保证一个表中的ID的唯一,而不能保证整体的ID唯一。41位的时间戳,41bit位可以表示241个数,每个数代表的是毫秒,那么雪花算法的时间年限是。 阅读详情

相关推荐

张正友标定法-MATLAB实验

该方法最早由微软研究院的Zhengyou Zhang教授提出,1998年发表在IEEE TRANSACTIONS ON PATTERNANALYSIS AND MACHINE INTELLIGENCE,论文题目为:AFlexible New Technique for Camera Calibration。 (一)标定平面到图像平面的单应性 单应性(homography):在计算机视觉中被定义

qq_37845624的博客 8290

谈谈常用的分布式 ID 设计方案?

分布式 ID 设计方案需要满足全局唯一性、高性能、高可用、趋势递增等要求,以下是一些常用的分布式 ID 设计方案:INCRINCRBYINCRINCRBYINCR。

2303_78378466的博客 1102

单片机多级菜单的简单实现

单片机多级菜单的简单实现 多级菜单的思路 最近想把stm32上的oled显示屏做的好看一些,于是动手写了写一个多级菜单,思路很简单,每个页面用单独的函数封装好,每个功能也是用单独的函数进行封装,用了3个按键,两个切换键,一个确定键。 首先来看看用啥判断页面的(这偷个懒,希望没人打我) //页面标志位 uint8_t s1 = 0; //主页面功能号 uint8_t s2 = 0; //主次页面判断标志位 uint16_t s3 = 1; //次页面功能号 主页面的显示函数,这是个很枯燥的一

qq_43940175的博客 7608

美团 Leaf分布式ID解决方案

前言 看了一下美团的分布式ID的解决方案,谈谈自己的理解和思考。其中参考博客就是美团的分布式ID leaf的链接,可以直接跳转去看。 Leaf-segment 数据库方案 这里采用的是从数据库读取,每次从数据库里读取id起始点和步长,比如读取id为1000,步长为1000,那么可以生成的分布式id范围为1000 - 2000 。但不仅仅是这么简单的数字,一般形式如下: biz_tag + id ...

笔记小屋 2369

Synopsys工具filter命令:从数据筛选到高效IC设计的实战指南

在数字集成电路设计流程中,数据筛选与查询是工程师处理海量网表、时序报告和设计约束的核心需求。其原理在于通过声明式查询语言,直接对设计对象(如单元、网络、路径)的属性进行逻辑判断与模式匹配,从而精准定位目标。这种技术价值在于将工程师从繁琐的过程式脚本循环中解放出来,大幅提升代码可读性与运行效率,直接调用工具内置的高性能查询引擎。在实际应用场景中,它广泛用于物理与时序联合分析、层次化模块操作、动态约束生成以及自动化报告生成。本文聚焦于Synopsys工具链中filter命令的高阶用法,深入解析其表达式语法、正则

weixin_28007513的博客 578

C++面向对象编程-继承与派生练习题

2、共同派生类 3、人员类Person的派生(虚基类的使用)

编程小鹏的博客 1193

分布式ID生成器与CAS在分布式ID生成方案上的应用

分布式ID生成器 一、需求缘起 几乎所有的业务系统,都有生成一个唯一记录标识的需求,例如: 消息标识:message-id 订单标识:order-id 帖子标识:tiezi-id 这个记录标识往往就是数据库中的主键,数据库上会建立聚集索引(cluster index),即在物理存储上以这个字段排序。 这个记录标识上的查询,往往又有分页或者排序的业务需求,例如: 拉取最新的一页消息 select m...

mhHao的博客 415

基于PCL的电力线点云提取与分割实现

本文基于PCL库实现电力线点云提取与分割,包含6个核心处理阶段:文件读取与结果文件夹创建、高程滤波分割候选点云、欧式聚类去噪、电力线分段提取、球形邻域搜索补全点云、最终分割与可视化保存。通过PCA计算点云线性特征(阈值0.91)筛选电力线点,采用欧式聚类(容忍度3.0)去除噪点,并针对不同规模聚类差异化设置球形搜索半径(4.0/6.0)补全点云。最终通过欧式聚类分割并可视化带颜色点云。算法对高程滤波阈值、聚类参数等具有敏感性,需根据点云特性调整优化。

weixin_45196569的博客 196

分布式Id - redis方式

本篇分享内容是关于生成分布式Id的其中之一方案,除了redis方案之外还有如:数据库,雪花算法,mogodb(object_id也是数据库)等方案,对于redis来说是我们常用并接触比较多的,因此主要谈谈结合redis生成分布式id方案。 分布式Id设计流程图 基于redis的hash自动increment累加生成有序Id 定期删除无用hash列 分布式Id设计流程图(有...

weixin_30820151的博客 277

ABAP Channels 之 WebSocket 通信实践:用 ABAP Push Channel 打造实时应用

摘要:本文介绍了ABAP Push Channel(APC)技术,它通过WebSocket协议实现ABAP系统与外部客户端的实时双向通信。文章对比了传统HTTP轮询与WebSocket的差异,解释了APC的事件模型及其接口演进(从IF_APC_WS_EXTENSION到IF_APC_WSP_EXTENSION)。通过仓库拣货等实际案例,展示了APC在企业级应用中的价值,如实时监控、协作场景等。文中还详细阐述了ABAP引擎中WebSocket的交互模型,说明其资源优化设计原理,并提供了基础代码示例。该技术解决

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 298

机器学习势能(MLPs) 第一章 基础理论与核心概念 第二章 数据生成与训练集构建

密度泛函理论(DFT)作为现代计算材料科学的基石,通过求解Kohn-Sham方程在电子结构层面提供可靠的势能面信息。然而,其计算复杂度随体系电子数呈O(N3) 至O(N4) 增长,对于包含数百个原子的体系,单点计算往往需消耗数小时至数天的计算资源。这一瓶颈严重限制了分子动力学模拟的时间尺度,传统DFT-MD通常仅能覆盖皮秒量级,远不足以观测扩散、相变等慢动力学过程。经验力场通过解析函数形式描述原子间相互作用,实现了经典力学的计算效率,但其参数化过程高度依赖物理直觉与经验调参。

VectorShift的博客 185

一站式了解全局分布式生成ID方案

时钟回拨是指系统时钟在运行过程中,由于某些原因导致获取到的当前时间戳比上一次获取的时间戳还要小的现象。核心成因NTP 强行同步:服务器通常会通过 NTP (Network Time Protocol) 协议与时间服务器同步。如果本地时钟比 NTP 服务器快,同步时可能会导致本地时间跳回。管理员手动修改:运维人员手动调整了服务器系统时间。闰秒调整:虽然罕见,但地球自转变化导致的闰秒补偿也可能引起微妙的时间跳变面向公网、用户可见的 ID→ 用随机生成,存字段,不可逆(安全优先)

欢迎大家指正与批评,还有掘金同名博客欢迎大家关注 1110

计算电磁学(三)有限差分方法

有限差分方法(FDM)是一种数值处理方法,通过将偏微分方程变换为一组代数方程,通过求解代数方程组来得到原边值问题的近似值。由于有限差分法非常简单,所以也特别的稳定高效。其中时域有限差分方法(FDTD)是电磁分析中的常用方法。在计算电磁学中,常用有限差分方法(finite difference equations)来替代微分方程。一个有限差分法通常包括三个步骤将求解域划分网格用有限差分方程逼近给定的微分方程求解在给定边界条件和初始状态下的方程常用的网格模型方阵斜方阵三角阵圆形阵。

CCC_B的博客 1640

谈谈常用的分布式 ID 设计方案

高性能、分布式环境下无冲突,易于水平扩展,适用于大规模分布式系统,生成的 ID 是全局唯一的,且可以保证高效地生成,不依赖于集中式服务。基于数据库的号段模式,即预先在数据库中生成一段 ID 号段,应用启动时获取该号段,当本地的号段快用完时,再去数据库获取新的号段。:UUID 比较长,占用存储空间大,不保证 ID 生成的有序性,可能会影响数据库索引效率。:实现复杂,需要依赖于 Google 的基础设施,对于一般的分布式系统来说成本较高。:简单易用,无需依赖中心化服务,生成速度快,适用于无需严格顺序的场景。

gghfzs1的博客 539

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

谈谈分布式、集群与微服务

分布式:一个应用(业务)分拆多个子应用(业务),部署在不同的服务器上。子应用(业务)之间的计算结果通过网络通讯协议进行消息传递。 集群:同一个应用(业务),部署在多个服务器上,独立运行,应用(业务)都相同,多个服务之间不需要通讯。 一个复杂的大型应用应该是分布式和集群的结合,具体实现就是业务拆分成很多子业务,进行分布式的部署,然后针对每个子业务进行集群部署,这样每个子业务如果出了问题,整个系统完全不会受影响。 也可以先对这个应用中最紧急的子业务先进行集群部署,然后通过分布式的部署...

lanyuxinkong的专栏 499

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

浅谈CAS在分布式ID生成方案上的应用 | 架构师之路

近几篇文章聊CAS被骂得较多,今天还是聊CAS,谈谈CAS在一种“分布式ID生成方案”上的应用。所谓“分布式ID生成方案”,是指在分布式环境下,生成全局唯一ID的方法。...

shenjian58的博客 574

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

纯数字id 不重复没规则_分布式Id - redis方式相关知识点

本篇分享内容是关于生成分布式Id的其中之一方案,除了redis方案之外还有如:数据库,雪花算法,mogodb(object_id也是数据库)等方案,对于redis来说是我们常用并接触比较多的,因此主要谈谈结合redis生成分布式id方案。分布式Id设计流程图基于redis的hash自动increment累加生成有序Id定期删除无用hash列分布式Id设计流程图(有点粗略)基于redis的hash自...

weixin_39970689的博客 327

谈谈对分布式链路追踪与监控的理解

分布式链路追踪与监控分布式链路追踪与监控背景分布式跟踪术语性能采样数据收集安全与隐私trace生成的损耗数据展示与查询服务告警 分布式链路追踪与监控 现代互联网服务通常是复杂的大规模分布式系统,持续跟踪与监控每个服务显然是必须的。 背景 比如一个web搜索,前端服务器经一个web查询分发给上百台搜索服务器,每个服务器在自己的inedx上搜索,例如搜索新闻,图片,视频,音乐,博客等,还需要配合例如...

gentlezuo的博客 1396

postgressql 自动生成id_分布式Id - redis方式相关知识点

本篇分享内容是关于生成分布式Id的其中之一方案,除了redis方案之外还有如:数据库,雪花算法,mogodb(object_id也是数据库)等方案,对于redis来说是我们常用并接触比较多的,因此主要谈谈结合redis生成分布式id方案。分布式Id设计流程图基于redis的hash自动increment累加生成有序Id定期删除无用hash列分布式Id设计流程图(有点粗略)基于redis的hash自...

weixin_42110469的博客 574

10.分布式与微服务

幂等是指一个方法被多次重复执行的时候产生的影响和第一次执行的影响相同。之所以要考虑到幂等性问题,是因为在网络通信中,存在两种行为可能会导致接口被重复执行。用户的重复提交或者用户的恶意攻击,导致这个请求会被多次重复执行。在分布式架构中,为了避免网络通信导致的数据丢失,在服务之间进行通信的时候都会设计超时重试的机制,而这种机制有可能导致服务端接口被重复调用。所以在程序设计中,对于数据变更类操作的接口,需要保证接口的幂等性。

weixin_39480141的博客 1279

【Java面试笔记:应用】39.谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?

Snowflake时钟问题:冬令时切换可能导致时钟回拨,但通过NTP同步、本地缓存和异常处理可规避风险。 方案选择: 高并发分布式系统:优先选择Snowflake或其改进版(如Leaf-Snowflake模式)。 强一致性要求:结合数据库号段模式与容错设计。 简单场景:UUID或数据库自增ID即可满足需求。

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 1263

每台电脑的唯一标识_聊聊分布式唯一ID

为什么需要唯一ID「ID」—又称「标识符」(identifier),是一个可以唯一识别一个对象或者物体的名称,被识别的对象可能是一些想法、物理上可数的对象或者物理上的不可数物质。在传统单机服务的情况下,往往通过一个数据库的逐渐甚至内存中生成的数据就可以唯一标识一个用户或者订单,但是随着业务的增长,出现多台主机和多个数据库分库分表,也就是所谓的分布式服务出现,这时候就需要一个不会重复的全局...

weixin_39601194的博客 4320

Java面试:分布式ID与分布式定时任务的深度探讨

本次面试通过层层深入的提问,全面考察了候选人在分布式ID和分布式定时任务方面的技术能力。候选人的回答不仅展现了扎实的理论基础,还体现了丰富的实战经验。面试官对候选人的表现给予了高度评价,认为其是团队中不可多得的技术人才。

南客先生的博客 410

阿里专家讲中台:技术中台-分布式架构在蚂蚁金服的实践

本文整理自,阿里高级技术专家-许文奇在2019阿里云峰会上的分享《技术中台-分布式架构在蚂蚁金服的实践》,结合技术领导力社区架构专家的点评和解读,全面解析阿里技术中台的架构实践。通常一个初创型项目,都是从单体架构开始的。就是快,易于开发、测试、部署,一个WAR包发上生产就完事了。也很明显,因为所有模块都在一个程序包里,导致编译慢、启动慢、代码冲突,每次合并代码的时候都是恶梦,发布成功率?完全靠运气。

weixin_74412978的博客 918
上一篇: 96W,确实可以封神了!!
下一篇: 为什么王者荣耀不使用微服务架构?
公众号-芋道源码
博客等级 码龄10年 1636粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值