业务ID 生成规则
在实际业务中,是否碰到过这种场景:
我们需要一个单号,要在业务系统里面保证唯一,保证增长?
在运营过程,需要知道业务单发生的时间,最好不用经过系统查找就知道发生的时间?
在排障过程中,不用再次查找就知道,订单的一些信息?
业务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 生成规则的更多相关文章
- 业务ID 生成策略
业务ID 生成策略,从技术上说,基本要借助一个集中式的引擎来帮忙实现. 为了扩大业务ID生成策略的并发问题,还有更为技巧性的提升. 先来介绍普遍的分布式ID生成策略: 1. 利用DB的自增主键 这里又 ...
- MongoDB小结22 - id生成规则
MongoDB的文档必须有一个_id键. 目的是为了确认在集合里的每个文档都能被唯一标识. ObjectId 是 _id 的默认类型. ObjectId 采用12字节的存储空间,每个字节两位16进制数 ...
- 服务器唯一id生成规则
在使用hashCode的时候,发现会出现相同id,虽然几率很小.虽然发现并不是hashCode的原因,而是其他逻辑的问题. 但是还是试着自己写了一个id生成器,有些id是int的,比如说任务id:有些 ...
- 配置 ClientIDMode 控件ID生成规则
废话不说先例子: <asp:GridView ID="grd" runat="server"AutoGenerateColumns="False ...
- 分布式唯一ID生成服务
SNService是一款基于分布式的唯一ID生成服务,主要用于提供大数量业务数据建立唯一ID的需要;服务提供最低10K/s的唯一ID请求处理.如果你部署服务的CPU资源达到4核的情况下那该服务最低可以 ...
- 分布式系统ID生成办法
前言 一般单机或者单数据库的项目可能规模比较小,适应的场景也比较有限,平台的访问量和业务量都较小,业务ID的生成方式比较原始但是够用,它并没有给这样的系统带来问题和瓶颈,所以这种情况下我们并没有对此给 ...
- 分布式全局唯一ID生成策略
为什么分布式系统需要用到ID生成系统 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在美团点评的金融.支付.餐饮.酒店.猫眼电影等产品的系统中,数据日渐增长,对数据库的分库分表后需要有 ...
- 架构设计 | 分布式业务系统中,全局ID生成策略
本文源码:GitHub·点这里 || GitEE·点这里 一.全局ID简介 在实际的开发中,几乎所有的业务场景产生的数据,都需要一个唯一ID作为核心标识,用来流程化管理.比如常见的: 订单:order ...
- 分布式唯一ID生成方案是什么样的?(转)
一.前言 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订单表.因为数据量巨大一张表无法承接,就会对其进行分库分表. 但一旦涉及到分库分表,就会引申出分布式系统中唯一主键ID的生成问题, ...
随机推荐
- jquery 方法学习
遍历 .add():将元素添加到jquery对象 argument:selector, element, html, jqueryObject $('li').add('p').css('backgr ...
- 循环读取list 的几种方法?
1.最常用的方法.循环找出该位子的list元素for(int i = 0;i < list.size(); i ++){System.out.println(list.get(i));}2.利用 ...
- Example11(June 9,2015)
%--------------sort------------------------------- >> A=[ ; ; ] A = >> B=sort(A,)%A(:,)& ...
- Android-ActionBar-与Menu结合
ActionBar就是一个标题栏,以前Android3.0之前还称为标题栏,Android3.0之后取名为ActionBar 首先必须在AndroidManifest.xml中指定Applicatio ...
- LinkServer--访问远程数据表三种方式
在TSQL中访问远程数据库有三种方式:1.OPENROWSET2.OPENDATASOURCE3.LinkServer 在使用openrowset/opendatasource前搜先要启用Ad Hoc ...
- winform之combobox
绑定键值对: ArrayList mylist = new ArrayList(); mylist.Add(new DictionaryEntry("WinFormURL", &q ...
- dorado-menu
1.menu控件是一个下拉菜单控件,可以设置数icon(图标),click事件,Dorado事件中都有self和arg两个参数,其中self是当前控件本身 2.menu控件可以和toolBar结合使用 ...
- 几条shell命令
windows: route add 158.0.0.0 mask 255.0.0.0 158.137.38.1 metric 3 linux: netstat -apn 查看所有端口使用,可查看端 ...
- Day 61 Django第二天 (orm数据库操作)
一.get请求和post请求 GET请求: 1. 浏览器请求一个页面 2. 搜索引擎检索关键字的时候 POST请求: 1. 浏览器向服务端提交数据,比如登录/注册等 二 . Django中的APP: ...
- Day 6 编码的进阶
https://blog.csdn.net/Deft_MKJing/article/details/79460485 a.ascii码:8位表示一个字符,共可以表示2**8个(即256)字符 , ...