1.关于订单号

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

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

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

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

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

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

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

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

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

123736088576847054

121102577636847054

119636777937847054

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,可以使用如下方式:

订单队列架构思想(分布式订单号生成策略)(1)

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

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

订单队列架构思想(分布式订单号生成策略)(2)

,