系统设计 | 业务编号生成
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
文 | 少个分号
这篇文章是关于线上Webinar讨论的整理,主要聚焦于系统设计问题。Webinar是一个每周举办的活动,旨在分享不同公司在架构和系统设计方面的实践和做法。作者已经整理了二十多次讨论的相关材料,感兴趣者可以通过链接访问会议邀请、笔记和往期录屏。
本次讨论集中在一个具体的问题上:如何生成满足特定要求的订单编号。该订单编号需要是固定10位长度,包含订单类型字母缩写、年月日和一个递增序列,且每天重新开始。系统的日均单量约一万,订单均匀分布,且并发不高。
对于这个问题,作者分析了UUID和数据库自增ID主键不适用的原因,并提出了一系列可能的解决方案,包括使用时间戳、数据库sequence、自增ID组合、表锁、行锁、内存中的原子类、发号服务、Redis以及自定义存储过程等。
经过分析,作者排除了一些不切实际或维护性不佳的方案,并根据业务需求、基础设施、可维护性、性能和可靠性等因素,推荐了几种方案。如果使用Oracle或PostgreSQL,可以考虑直接使用sequence;如果使用MySQL且有高可用的哨兵Redis,可以考虑使用Redis;如果没有Redis,则可以额外通过数据库表实现计数需求;对于高性能需求,则推荐使用发号服务。
作者还提出了其他注意事项,包括编号生成时机、避免某些低效率方案、处理Redis Key丢失的方法,以及使用公共服务或Common包实现编号功能。
最后,作者提供了使用Oracle和PostgreSQL的sequence以及使用Java和Redis来实现按日生成的业务单号的参考实现代码。
文章强调,在系统设计过程中,要避免过早进入解决方案,应该首先充分分析问题,然后再进行技术决策。提供了一条清晰的技术方案分析和决策过程,以及如何通过AI快速实现Demo提高开发效率的案例。
原文链接和作者联系方式附于文末,如有内容错误,读者可以联系作者获得纠正。
想要了解更多内容?
白皮书上线