Skip to content

面试速答(先看这里)

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

60秒标准回答:

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

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

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

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**在设计一个订单号生成服务的时候,我们需要解决以下几个问题,当我们知道这些问题该如何解决的时候,整体的方案也就大概知道了。
  • **要点2:**比如我自己出的的 高并发实战项目 中,订单号是这样组成的:
  • **要点3:**中间的18-20位用一个唯一的ID来表示,可以用雪花算法,也可以用Leaf,总之就是他需要保证唯一性。
  • **要点4:**最后4位,基于基因法,将分表后的结果获取到,把他也编码到订单号中。

**记忆锚点:**让你设计一个订单号生成服务 → 常见的唯一性生成算法 → Snowflake → 等都是不同的业务类 → 位数字表示业务类 → Redis

关键取舍:

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

追问准备:

  • 围绕「让你设计一个订单号生成服务」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「常见的唯一性生成算法」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「Snowflake」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

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

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

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

打开文档:✅什么是UUID,能保证唯一吗?

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

打开文档:✅什么是雪花算法,怎么保证不重复的?

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

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

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

📄 ✅分表字段如何选择?

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

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

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

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

image.png

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

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

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