热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

生成唯一序列号UniqueID

唯一的序列号UniqueID,在程序的各个方面都有所应用,特别是数据存储方面。很多数据库都需要一个自增的唯一的序列号作为PrimaryKey。最

         唯一的序列号Unique ID,在程序的各个方面都有所应用,特别是数据存储方面。很多数据库都需要一个自增的唯一的序列号作为Primary Key。

 

         最简单的Unique ID就是在内存中维护一个long序列,每次取用的时候做i++。这是最简单的UniqueID,在单线程程序中适用。

         随着盘子越做越大,架构和程序会引入各种新的特性,这时候需要重新考虑Unique ID的维护:

         引入多线程,取数的时候就会出现线程竞争,这时候需要通过加锁来保证ID的唯一性,可以使用AtomicLong来解决冲突和一致性的问题。

         引入多进程,原来放在同一个程序内存的Unique ID会变得不适用,只能往外迁,通过一个单独的进程来维护和提供服务。这时候,可以把维护Unique ID的任务交给数据库,数据库的Sequence就是充当这个角色。UniqueID大部分功能都是和数据捆绑在一起的,理所当然地可以把Unique ID的逻辑放到持久层。另外,为了降低数据库的压力,取Sequence可以按步长一次取一个范围。

         引入分布式,同理多进程,当需要在分布式系统中维护Unique ID,需要使用一个单独的服务来提供Unique ID的服务。系统数据的量级也大大提升,单独的数据库一般难以满足数据量的需求,需要做读写分离,分表分库等一系列的优化。这时候,数据库来维护Unique ID不仅需要兼顾本身集群的特性,还要应对大数量的并发请求,难免会造成性能的下降。

         所以,通过一个单独的服务来创建和维护Unique ID(一般称为发号器),是非常有必要的。把Unique ID的逻辑分离出去,也便于数据库系统的伸缩扩展。当然,为了提高发号器的效率,减少网络的延迟,通常会按照不同数据中心不同机房来单独部署。同时,要做好各个发号器间的同步,例如以时间为生成标准,则需要同步时间。

         可是,程序取号的锁竞争和网络延迟是不可避免的,所以最理想的Unique ID策略还是本地生成把发号器内嵌到每个程序中,同时保证生成标准的同步

 

         对于小规模应用,维护UniqueID很简单。接下来主要讨论,分布式系统中Unique ID的维护逻辑。综上所述,处理策略主要分三个方向:

借助第三方:数据库,Redis

单独服务:发号器(Weibo,Twitter的SnowFlake)

本地生成:UUID

         这里主要考虑点:发号器的性能和高可用性。ID的长度,用64bit的一个long来存储是最合适的(UUID的128bit就太长了),符合操作系统的处理,但是长度有限,很难把完全唯一的信息都存进去。


具体的分析过程和策略可以参考《Unique ID的特性需求分析》和《Unique ID策略》。




推荐阅读
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 旁路|发生_Day749.旁路缓存:Redis是如何工作的Redis 核心技术与实战
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Day749.旁路缓存:Redis是如何工作的-Redis核心技术与实战相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 基于分布式锁的防止重复请求解决方案
    一、前言关于重复请求,指的是我们服务端接收到很短的时间内的多个相同内容的重复请求。而这样的重复请求如果是幂等的(每次请求的结果都相同,如查 ... [详细]
author-avatar
手机用户2502920591_700
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有