✅让你设计一个订单号生成服务,该怎么做?

典型回答

在设计一个订单号生成服务的时候,我们需要解决以下几个问题,当我们知道这些问题该如何解决的时候,整体的方案也就大概知道了。

  1. 唯一性:订单号必须保证唯一性,否则会出现订单冲突和数据不一致等问题。可以使用一些常见的唯一性生成算法,例如UUID、Snowflake等。

✅什么是UUID,能保证唯一吗?

✅什么是雪花算法,怎么保证不重复的?

  1. 数据量:在设计订单号的时候,需要充分的考虑到后续数据量变大的情况下该如何兼容。所以需要提前预留出足够的位数。

  2. 可读性:订单号应该易于理解和记忆,可以根据业务需求自定义订单号的格式和组成方式,例如使用时间戳、随机数、用户ID等信息来构造订单号。

  3. 基因法:订单系统到最后都可能会考虑分库分表,所以在最初设计订单号的时候,需要考虑将和分表有关的字段编码到订单号中,如买家ID等。

✅分表字段如何选择?

  1. 可扩展性:订单号生成服务需要支持高并发、分布式部署和横向扩展等特性,可以采用分布式ID生成器、Redis等技术来实现。

  2. 高性能:订单号生成服务需要具有高性能和低延迟的特点,可以使用内存缓存、异步处理等技术来优化性能。

  3. 高可用性:订单号生成服务需要保证高可用性,可以使用多节点部署、负载均衡、健康检查等技术来提高系统的可靠性和稳定性。

比如我自己出的的高并发实战项目中,订单号是这样组成的:

1723718408978-41daed0b-219a-49f3-a318-b8e78c0eb7fd.png

通过2位数字表示业务类型,如交易订单、支付单、结算单等都是不同的业务类型,可以有不同的编号。

中间的18-20位用一个唯一的ID来表示,可以用雪花算法,也可以用Leaf,总之就是他需要保证唯一性。

最后4位,基于基因法,将分表后的结果获取到,把他也编码到订单号中。

原文: https://www.yuque.com/hollis666/xkm7k3/gg4fgfh4z1ff2qfi