业务编号的奇妙经历

132 阅读2分钟

奇怪的需求

业务开发过程中总能遇到各式各样的需求,比如这个:业务编号生成。

生成业务编号是如下格式:BZ000001、BZ000002,其中BZ是业务前缀;要求递增且连续。

解决方案

看了前人的代码,采用了一个比较骚的方案: mysql的自增主键来实现,可能是考虑到实现时间&业务场景,业务上qps极小。

实现过程如下:

先把记录insert进表,获取记录的自增主键,再拼接上业务前缀,进行update。

本质上,一步操作拆两步。

怎么抗?-第一个坑来了

大家也很容易想到,上面那个方案,在批量新增情况下,效率奇差。

比如产品增加了excel导入的需求。怎么办?

那只能接下这个锅,对方案进行改造。

最直接的方案是使用redis,利用incryBy命令实现线程安全递增。

领导说不行,redis是咱们自己搭建的sentinel集群,宕机数据恢复问题不好解决。

那就先用mysql做一个方案:单独用一张表存放id使用情况,记录已使用的最新的编号。调用者获取该业务的记录,在内存里计算要使用的最后一个id,然后回写最后1个id至该表。

流程如下:

PixPin_2024-02-18_10-25-44.png

考虑到,峰值qps也就10左右,单个请求响应约70ms,1s的延迟可以接受。

扩展

由于是低流量业务,方案已经满足要求。

但如果流量稍微增长点,比如峰值qps到1k,系统应该如何设计?

要想数据不丢失&性能较高,那就只有使用redis,通过数据一致性弥补redis的可靠性

PixPin_2024-02-18_10-39-16.png