问题:
最近在做价格系统的同步功能,简单描述下需求就是多家商城会跟随平台的采购成本和设置的毛利率而自动调整。每一次调整会生成批次记录。在测试环节发现生成的调价记录单号有重复的,我的第一判断是幂等没有控制好出现了重复插入的数据。经过排查发现,虽然单号是相同的但是它们的调价明细并不相同,由此可以排除幂等问题,它们并不是两条重复数据。翻看实现代码发现同事写的生成单号的规则直接用的时间戳代码如下:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
Long adjustNo = Long.valueOf(formatter.format(LocalDateTime.now()));
很明显在并发场景下如果两个单号在同一时刻(毫秒级)生成则会出现重复。如何解决这个问题?
分析:
生成单号是一个常规需求,单号作为单据信息的唯一标识,在很多业务场景中都需要生成单号,例如用户下单的订单号,设置记录的批次号,发货信息的发货单号等等。生成单号的策略要考虑到两个因素:
1、业务的并发量
2、未来的业务的增长量
生成的单号一般要满足以下三个条件:
1、唯一性,即每次生成的单号不能重复。
2、长度固定&