在实际业务中,是否碰到过这种场景:

我们需要一个单号,要在业务系统里面保证唯一,保证增长?

在运营过程,需要知道业务单发生的时间,最好不用经过系统查找就知道发生的时间?

在排障过程中,不用再次查找就知道,订单的一些信息?

业务ID 经常需要生成以方便后续跟踪使用。一般需要满足以下特性:

1. 唯一性

2. 可阅读

3. 增长

4. 数字类型?

5. 其他信息(payload)

所以,业务ID的生成,这里涉及两个问题:

1. ID 的规则,也就是ID 最终长什么样,满足什么约束

2. ID 生成策略

比如,一个常见的订单号生成规则可能如下:{yyyyMMddHHmm}[0-9][0-9]{4}

这个规则满足了以下约束:

1. 17位数字, 数据库存储可以用BIGINT 存储, 各系统接口可以使用Long 类型交互

2. 可以阅读, 通过{yyyyMMddHHmm} 快速的知道订单的创建时间

3. 可以猜测类型, 如中间的[0-9],支持10种类型, 这个数据丰富信息,可不存。

4. 支持的最大并发在每分钟10000,在系统确实有每分钟10000个订单,这个单号生成策略就够了

当然,上述订单号规则,只是一种实例,不过对大多数小系统足够了。即便是这样,上述规则,也有一些缺陷。

比如Long 范围的限定情况下, 使用了类似string 的 拼接技术,未能充分使用Long的范围。

如果ID 规则,不用太多考虑可读性的话, 可以像设计序列化协议一样,设计的更为紧凑,以容纳更多信息, 比如Long 有64bit,可以按照bit 长度划分成若干段。

现实中,有很多系统为了单号的可读性,经常会超出Long的最大值,所以设计为 NChar(128) 也比较常见。

业务ID 生成规则的更多相关文章

  1. 业务ID 生成策略

    业务ID 生成策略,从技术上说,基本要借助一个集中式的引擎来帮忙实现. 为了扩大业务ID生成策略的并发问题,还有更为技巧性的提升. 先来介绍普遍的分布式ID生成策略: 1. 利用DB的自增主键 这里又 ...

  2. MongoDB小结22 - id生成规则

    MongoDB的文档必须有一个_id键. 目的是为了确认在集合里的每个文档都能被唯一标识. ObjectId 是 _id 的默认类型. ObjectId 采用12字节的存储空间,每个字节两位16进制数 ...

  3. 服务器唯一id生成规则

    在使用hashCode的时候,发现会出现相同id,虽然几率很小.虽然发现并不是hashCode的原因,而是其他逻辑的问题. 但是还是试着自己写了一个id生成器,有些id是int的,比如说任务id:有些 ...

  4. 配置 ClientIDMode 控件ID生成规则

    废话不说先例子: <asp:GridView ID="grd" runat="server"AutoGenerateColumns="False ...

  5. 分布式唯一ID生成服务

    SNService是一款基于分布式的唯一ID生成服务,主要用于提供大数量业务数据建立唯一ID的需要;服务提供最低10K/s的唯一ID请求处理.如果你部署服务的CPU资源达到4核的情况下那该服务最低可以 ...

  6. 分布式系统ID生成办法

    前言 一般单机或者单数据库的项目可能规模比较小,适应的场景也比较有限,平台的访问量和业务量都较小,业务ID的生成方式比较原始但是够用,它并没有给这样的系统带来问题和瓶颈,所以这种情况下我们并没有对此给 ...

  7. 分布式全局唯一ID生成策略

    为什么分布式系统需要用到ID生成系统 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在美团点评的金融.支付.餐饮.酒店.猫眼电影等产品的系统中,数据日渐增长,对数据库的分库分表后需要有 ...

  8. 架构设计 | 分布式业务系统中,全局ID生成策略

    本文源码:GitHub·点这里 || GitEE·点这里 一.全局ID简介 在实际的开发中,几乎所有的业务场景产生的数据,都需要一个唯一ID作为核心标识,用来流程化管理.比如常见的: 订单:order ...

  9. 分布式唯一ID生成方案是什么样的?(转)

    一.前言 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订单表.因为数据量巨大一张表无法承接,就会对其进行分库分表. 但一旦涉及到分库分表,就会引申出分布式系统中唯一主键ID的生成问题, ...

随机推荐

  1. Hibernate多对多双向关联需要注意的问题(实例说话)

    以Student和Course为例,一个学生可以选多门课程,一门课程也可以被多个学生选取: 持久化类Student: package bean; import java.util.Set; publi ...

  2. 网友写的解决uniGUI限制的方法

    群友写的解决uniGUI试用版限制修改SessionTimeOut,思路很精巧,贴过来分享,感谢朋友的奉献.当然,如果真正用uniGUI实做项目,买份正版是正道! var   UniServerOpt ...

  3. ModuleNotFoundError: No module named 'sqlite'

    解决 ModuleNotFoundError: No module named 'sqlite'.问题 今天在将Python2.7升级至Python3.6后导入sqlite模块时出现了一下报错,到网上 ...

  4. android应用搬家的实现

    android手机上的应用搬家功能,具体的介绍和原理参考: 系统目录及应用搬家的研究 应用搬家的实现 这里主要是作为一个补充,因为上面两篇文章虽然讲的挺好的,但是给出的例子不能直接运行,还是需要一些准 ...

  5. C# 对接Https接口

    最近公司项目需要对接Https接口,将对接的代码整理如下: public void Get() { HttpWebRequest request = null; request = WebReques ...

  6. openstack 创建虚拟机的时候报错: Failed to allocate the network(s), not rescheduling.].

    错误: 实例 "test-gtj" 执行所请求操作失败,实例处于错误状态.: 请稍后再试 [错误: Build of instance 5ea8c935-ee07-4788-823 ...

  7. PHP7 - 如何禁用Xdebug

    操作系统:Cent OS 7 什么是Xdebug?看它的官方网站介绍: https://xdebug.org/index.php 为什么要禁用呢?这是因为Composer,这两种工具有冲突,在使用Co ...

  8. 面对对象编程(OOP, Object Oriented Programming)及其三个基本特性

    一千个读者,一千个哈姆雷特.对于面对对象编程,书上都会告诉我们它有三个基本特性,封装,继承,多态,但谈起对这三点的见解,又是仁者见仁智者见智,感觉还是得多去编程中体验把 . 面向对象编程(OOP, O ...

  9. Get Requests with Json Data && Get Requests with Url Parameters

  10. Jmeter-正则表达式提取器获取token-小实例

    步骤一:在需要获取token的接口上,添加正则表达式提取器 说明: (1) Apply to:应用范围 Main sample and sub-samples:匹配范围包括当前父取样器并覆盖至子取样器 ...