如何搭建溯源系统

背景

大家购买跨境商品时,会发现商品上有一个溯源二维码,手机扫一扫就能发现这个货品从哪里来,到哪里去,经过了哪些港口。二维码一般如下图所示(不让填二维码):

为什么要有溯源码呢?

  1. 响应国家政策,“建立健全网购保税进口商品质量追溯体系,追溯信息应至少涵盖国外启运地至国内消费者的完整物流轨迹,鼓励向海外发货人、商品生产商等上游溯源。”

  2. 提升跨境品牌的消费者侧的正品心智及购物体验。跨境商品单价相对高,由于型号不同,可能会和国内买到的不一致,用户觉得自己买到假冒伪劣产品。差评很大一部分来自这种情况。溯源系统能够解决这个问题,用户能看到商品完整运输流程,打消很多疑虑。

  3. 后期可以做增值服务

角色

溯源系统包含如下角色

  • 溯源码供应商:负责生产溯源码

  • 供应链服务商:负责货物运输和贴码;从溯源码供应商处购买溯源码

  • 审核机构:负责对供应链服务商的溯源记录进行审核,机构一般有较强社会地位

  • 运营:负责为溯源码供应商提供溯源码列表信息、管理上述三个角色等

通过对角色的描述,我们需建立运营后台,核心功能点如下:

  1. 溯源码供应商备货:在后台申请溯源码信息,然后将申请到的溯源码进行打印

  2. 供应链服务商订购溯源码:供应链服务商向溯源码供应商下订单,购买已经打印出的溯源码

  3. 供应链服务商创建溯源记录:供应链服务商创建溯源记录,该记录绑定使用哪些溯源码,溯源记录经审核机构审核完毕后生效。然后供应链服务商就将溯源码贴到商品上,最终送到用户手中

如何搭建溯源系统_第1张图片

用户收到商品后,扫描溯源二维码,输入验证码后即可查看由审核机构认证的溯源信息。

技术方案

设计选型

系统设计方式有多种,常用的有数据驱动设计和领域驱动设计。

大家一般更习惯数据驱动设计,通过数据之间的流转,确定存储结构,然后在其上延伸出各个接口。这个设计方式偏向于面向过程设计,更符合我们的思考习惯。

领域驱动设计也很好,但更复杂一些,偏向于面向对象设计,大家有兴趣的话可以看这篇文章DDD的Go实战。

这次我们基于数据驱动来设计溯源系统。

表设计

在设计存储结构之前,我们需要知道溯源码是以码段方式进行管理的,管理码段的技术方案可参考整数区间计算,我这么设计。

通过对角色和流程的分析,我们可以确定几张核心表:

  1. 溯源码供应商备货表、溯源码表、溯源码供应商备货子表
  • 因为溯源码供应商需要向运营申请溯源码,运营审核通过后,我方系统会自动生成溯源码,溯源码供应商就可以下载这些溯源码进行打印

  • 为什么需要溯源码供应商备货子表?因为备货量可能为百万级别,我们可以将百万的量拆分成几千个溯源码为一条,这些子条目放到子表中,然后使用子表的数据,通过离线、异步方式生成溯源码。

  1. 供应链服务商购买溯源码表、供应链服务商购买溯源码码段表
  • 因为供应链服务商要向溯源码供应商下订单,购买溯源码

  • 供应链服务商手里的溯源码未必是连续的,所以对于一个订单,溯源码供应商给供应链服务商的溯源码可能来自多个码段,这就需要把信息存放到溯源码码段表

  1. 溯源记录表、溯源记录码段表、溯源码扫描记录表
  • 对于每一批要贴码的货物,供应链服务商需要创建溯源记录,让审核机构进行审核

  • 对于这批货,供应链服务商手里的溯源码也未必是连续的,所以需要放到码段表

  • 用户扫描某个溯源码后,扫描信息存放到记录表中

  1. 角色可用码段表、溯源码最大值表
  • 记录每个角色可用码段,系统可在此数据上进行码段分配操作,无需遍历其历史码段使用情况

  • 溯源码最大值表只用来存放当前最大的溯源码号,目的为用mysql的写锁解决高并发问题,防止高并发情况下导致备货订单有相同的溯源码段范围

表关系

表之间关系如下:

如何搭建溯源系统_第2张图片

通过关系图能够看出,任何一个溯源码都能轻易确定分配过程,能够找到属于哪个溯源码供应商、由哪个供应链服务商购买、用于哪个溯源记录、溯源码是否被扫描过。

技巧点

我们确认一些技巧点

  1. 合理设置索引:如根据需求,很多请求都根据溯源码值来进行索引,所以很多表可以将码段开始值、结束值设置为联合索引。即使用MySQL,只要索引设置合理,也能存放巨量溯源码

  2. 多用写锁:尽量使用写锁,写锁能够保证码段分配过程中不会因高并发出现问题,而且并发情况很少,不会影响系统性能

  3. 码段管理:要有可靠的管理码段的代码,这是整个项目的核心域,可参考整数区间计算,我这么设计

  4. 大量码段处理:百万级别的码段生成、下载,可采用分而治之思想,分成小块,一块一块生成、一块一块下载

总结

文章中的图可以从https://www.processon.com/view/link/6342c7921efad416787bc5d4 下载。

上面讲的是主干,还有很多细节可以补充,欢迎大家一起讨论。

最后

大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)

我的个人博客为:https://shidawuhen.github.io/

往期文章回顾:

  1. 设计模式

  2. 招聘

  3. 思考

  4. 存储

  5. 算法系列

  6. 读书笔记

  7. 小工具

  8. 架构

  9. 网络

  10. Go语言

你可能感兴趣的:(架构,大数据,人工智能,运维)