分布式订单号生成策略

分布式订单号生成策略

1.关于订单号

订单号用于记录用户在电商网站中的下单信息(通常有商品列表、金额、时间等),用户下单后可根据订单号查询支付状态、物流状态等,也可以根据订单号进行投诉、反馈、售后咨询等。

订单号的生成通常要满足的需求:

1)唯一性:订单号不可重复,以免发生业务冲突

2)简短:便于记录、存储

3)业务相关性:可根据订单号定位相关业务

4)时间相关性:可根据订单号定位发生时间范围

5)有序性:订单号应当有序,便于建立索引,提高查询速度

6)安全性:订单号不应透露用户量、交易量等信息,也不要让别人随便就能拼出来。

马克思告诉我们,具体问题具体分析,生成订单号也应该以具体业务需求为准。先来看一下淘宝的3个订单号:

123736088576847054

121102577636847054

119636777937847054

对比这3个订单号你能发现什么规律吗?除了后6位相同似乎没有别的规律。相同的后6位可能是截取自用户id或以用户id作为因子。这样做有什么好处呢?如果业务量大、并发较高可在订单号生成中加入用户id作为因子,由于单个用户在某一时间段内的请求是有限的(一般系统也可能会对用户操作的频率、下单次数进行限制,限制用户在某一时间段最多可以操作多少次或限制用户某一时间段内最多可以下多少单),所以这样做可以一定程度降低生成的订单号的重复率。

当然,可以借鉴和自己公司业务比较接近的公司的产品的订单号格式,如打车业务可以借鉴滴滴出行, 支付业务可以接近支付宝或微信支付等。

2.订单号生成策略比较

1)UUID: UUID是通用唯一识别码(Universally Unique Identifier)的缩写,由时间戳、机器标识码、随机数组成。优点是简单粗暴(可使用JDK自带的UUID实现- java.util.UUID),缺点是无序,不适合建立索引。

2)DB sequence:可以使用数据库提供的自增序列(如oracle和PostgreSQL的sequence,Redis的incr)作为订单号,缺点是位数不确定,有溢出风险,高并发情况下有性能瓶颈。

3)Snowflake: 也叫雪花算法,是由Twitter开源的分布式id生成算法,生成id时的因子是:时间戳+递增序列+机器号+业务号,默认生成的id是18位的long型数字。我测了一下4核CPU每秒可生成100w+个id,可以说性能还是不错的。查看其源码会发现,该算法只有简单的逻辑判断与位运算,没有字符串拼接也没有时间格式化。这应该是该算法相较于普通算法性能较高的主要原因。下面截图是snowflake算法生成id的关键代码:

twitter-scala版本: https://github.com/twitter/snowflake

java版本:https://github.com/downgoon/snowflake

想要在自己的项目中引入Snowflake很简单,可以引入其maven依赖,也可以直接复制其源代码(主要就一个Snowflake.java)到项目中。

使用Snowflake生成订单号(id)非常简单,需要注意的是其中两个参数的含义:

// dataCenterId可用于区分机器,workerId可用于区分业务

// datacenter: 2; workerId: 5

Snowflake snowflake = new Snowflake(2, 5);

long id1 = snowflake.nextId();

long id2 = snowflake.nextId();

如果需要解析生成的id,可以使用如下方式:

上图中arr[0-3]分别代表id生成的时间戳,机器标识,业务标识,序列号

当然,Snowflake算法虽然性能较高,但不一定符合实际业务,如果条件允许可以根据Snowflake源码做定制化实现,结合实际业务并汲取snowflake优秀的地方重新实现。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容