时隔16年Jeff Barr重返10.23-25 QCon上海站,带你看透AI如何重塑软件开发! 了解详情
写点什么

如何设计一个电商平台积分兑换系统?

  • 2020-06-20
  • 本文字数:3782 字

    阅读完需:约 12 分钟

如何设计一个电商平台积分兑换系统?

1、拉开差距的一类面试题

现在面试经常会遇到一类问题,面试官让你现场设计出某个业务场景下的一个系统,这个系统往往在业务或者技术上有一定难度,主要考察的是你多年积淀下来的系统设计的能力以及技术思维的能力。


类似的这类系统设计题目很多,比如:


  • 请你设计一个秒杀系统

  • 请你设计一个支撑百万用户的 IM 消息系统

  • 请你设计一个微信红包系统

  • 请你设计一个电商平台积分兑换系统


这些题目本身都是开放式命题,没有固定答案。遇到这种问题,一定不要慌,关键是在现场要思路清楚,有理有据,慢慢分析。


本文就其中一个问题:设计一个电商平台的积分兑换系统,来详细阐述一下。文中会详细指出在系统设计的时候要考虑哪些要点,给大家展示出来这类问题思考的一个过程。

2、业务需求的描述

假设面试官现在给出来对于这个电商平台的积分兑换系统的相关需求如下:


  1. 用户在电商平台里平时通过购买商品、晒单评论可以有不断的积累积分

  2. 积累到足够的积分后,就可以在电商平台的积分兑换页面中,选择使用自己的积分来兑换一些礼品


需求其实就这么简单,那么面试官说了,针对这个业务场景给出你对这个机制实现的思考过程以及这里要注意的一些地方。

3、对业务流程的思考

如何思考?首先,用户不停的购买商品以及晒单评论,会不断的获取积分,那么是不是需要一张积分表,专门用来存储每个用户的积分呢?


没错,这个表是一定需要的,可以现场给出下述的表结构。


积分表:


  • id(自增 id 主键)

  • user_id(用户 id)

  • credit(积分)


继续来看,假设在积分兑换页面,用户选择用自己的 20000 积分兑换一瓶洗发水,后台的逻辑应该如何设计呢?


这个也是必须得现场给出一个思考过程的,这个其实看起来简单,但是很多年纪较轻,经验不足的朋友,可能没法快速思考出来。


首先你要用 20000 积分去进行兑换,那么一定是必须要在积分表里扣减掉这 20000 积分的吧?所以在流程设计中,首先就得有一个 20000 积分扣减的过程。


其次,你用这 20000 积分兑换了什么东西呢?


所以你是不是还需要一张单独的表,叫做积分兑换记录表,记录下来你这个用户本次用多少积分兑换了一件什么商品?


这个积分兑换记录表的结构如下所示,你是不是需要在下面的那个表里插入一条记录,说这个用户本次用多少积分兑换了哪个商品?


积分兑换表:


  • id(自增 id 主键)

  • user_id(用户 id)

  • exchanged_credit(用于兑换的积分)

  • product_id(兑换的商品 id)


最后,光是插入上述那条积分兑换记录是不够的,你必须得调用仓储业务模块的接口,通知仓储业务模块新增一条发货申请,而且应该是积分兑换对应的发货申请,这样保证仓库可以准备对应的商品进行发货。


这个发货申请大致对应如下的表结构:


发货申请表:


  • id(自增 id 主键)

  • type(发货类型,1:购买,2:积分兑换)

  • credit_exchange_id(积分兑换表的 id)

  • product_id(要发货的商品 id)


其实这里的发货申请表简化了很多,按理说还得有发货商品的数量等等字段,但是这里可以简化处理也没事,毕竟是面试现场。


简单画出来这个流程大致如下所示。


4、物流配送进度查询,考虑到了吗?

如果把上面那整个业务流程给面试官说了,就完事了吗?


当然不是!


你可以站在用户的角度考虑一下,你是不是肯定还需要查看积分兑换的记录?这个在积分兑换表里可以查看到你用多少积分兑换了什么商品。


但是你兑换商品的物流配送进度,能查看到吗?不能。所以你应该在业务流程里再考虑进去对应的物流配送的逻辑。


通常来说一个基本的逻辑,就是在生产发货申请单的时候,需要调用第三方物流公司的接口申请一个物流单,这样仓库管理员打包准备好商品,坐等物流公司商品收快递就可以了。


物流公司会根据物流单去进行配送,这个配送地址当然是用户自己在电商平台选择的自己的某个地址。


此时发货申请单的表结构是不是如下所示?


发货申请表:


  • id(自增 id 主键)

  • type(发货类型,1:购买,2:积分兑换)

  • credit_exchange_id(积分兑换表的 id)

  • product_id(要发货的商品 id)

  • express_no(物流单号)


所以在生产发货申请单时,先得调用第三方物流公司的接口申请一个物流单,这样发货申请单中是有一个物流单号的,而且每个积分兑换记录都通过 id 跟发货申请单关联起来。


这样在页面上对每个兑换记录,是不是可以找到发货申请单中的物流单号,然后根据物流单号调用第三方物流公司的接口,去获取配送的进度?


这就是一个非常典型的业务系统的技术实现的逻辑思考,一个经验丰富合格的工程师,往往都具备了一定的业务思维,可以很好的根据业务系统中的用户逻辑来考虑,反推自己的系统技术实现逻辑。


上述整个过程,如下图所示:



##5、事务的保证


业务流程整个捋顺之后,接下来就涉及到技术的考虑了。你得考虑一下,这种业务系统里怎么能没有事务呢?


扣减积分、新增积分兑换记录、新增发货申请单,这三个步骤必须是要么一起完成,要么一起失败的。也就是说,这三个步骤必须是在一个事务里的。


现在有一个问题,对一个电商平台自身的业务系统来说,仅仅包含积分服务。但是仓储服务一般是独立部署的一套系统,或者是一个独立的服务。


也就是说,扣减积分和新增积分兑换记录可以在一个服务里是一个事务,但是新增发货申请单,他是在另外一个服务里的,这个事务如何保证呢?


有朋友可能马上回答:用分布式事务啊!先别急,咱们可以先用最简单的模式来实现一下。


比如积分服务在一个事务代码块中,先执行扣减积分、新增积分兑换记录两个步骤。


然后记住,在事务代码块中,最后一步调用仓储服务的接口,如果接口调用成功,那么就可以提交事务了。如果接口调用失败,那么就抛异常让事务回滚,这样可以不可以?


这个流程如下所示:


积分服务 事务 {


-> 扣减积分


-> 新增积分兑换记录


-> 调用仓储服务


}

6、消息中间件的引入

上述设计其实理论上是没问题的,但是这里你忽略了一个问题,在这个业务场景中,积分服务是没有必要同步调用仓储服务的。


因为积分兑换是一个用户执行的操作,假设你的仓储服务在生成发货申请单的时候调用第三方物流公司的接口,被卡住了,或者失败了,怎么办?


此时可能导致用户在页面上看到积分兑换按钮点击之后,卡在那儿可能几十秒都无法执行成功,所以这个系统如此设计是错误的。


那应该怎么做呢?你必须得在这里引入消息中间件进行异步化的解耦,保证用户点击积分兑换按钮之后,尽快返回。如下图所示:


7、重试机制的引入

到这里就 OK 了吗?还没呢!


一旦引入消息中间件之后,好处是用户点击积分兑换按钮,直接就是在积分服务里扣减积分以及新增积分兑换记录,然后发送一条消息到消息中间件里就结束了,速度很快,保证了用户体验。


但是坏处就是,万一仓储服务执行新增发货申请失败了怎么办?


这个时候就需要引入可靠消息服务了,他需要去保证仓储服务一定会完成新增发货申请这个事。


具体的流程如下:


  • 积分服务发送消息给可靠消息服务,可靠消息服务在消息表中新增记录,然后发送消息到 MQ(消息中间件)

  • 然后仓储服务消费消息新增发货申请单,如果成功就回调可靠消息服务的一个接口说自己成功了,可靠消息服务就可以更新本地消息表中的记录状态为成功

  • 如果仓储服务长时间没通知可靠消息服务自己成功了,可靠消息服务不停的重试再次发送消息


通过这样的设计,就可以保证可靠消息服务一定会无限次重试保证让仓储服务成功执行。再加上重试机制后,整个流程图如下所示:


8、引入幂等性机制

最后一个问题,如果仓储服务卡在第三方物流系统申请物流单的环节,长时间阻塞,所以没回调通知可靠消息服务。


但是可靠消息服务过了一段时间,感觉没收到回调通知,就自己重试发送了消息,这样岂不是会让仓储服务新增两条发货申请单?


因此我们还要保证仓储服务新增发货申请单的幂等性,其实也非常简单,回顾一下发货申请单表的结构:


发货申请表:


  • id(自增 id 主键)

  • type(发货类型,1:购买,2:积分兑换)

  • credit_exchange_id(积分兑换表的 id)

  • product_id(要发货的商品 id)

  • express_no(物流单号)


只要在“credit_exchange_id”字段上建立一个唯一索引就可以了,保证每个积分兑换记录只能创建一条发货申请单,如果重复创建就会被唯一索引被阻止,这样就可以保证这个行为的幂等性了。


至此,对这道系统设计题目的回答,全部结束。

9、对这类面试题的总结

通过这篇文章的分析,可以看到对这类开放式面试题的一个回答思路,首先得从业务上来考虑这个系统应该有哪些业务组成部分,如何实现业务流程?


其次就是你得考虑面临对应的业务场景的时候,这个系统会有哪些技术挑战,各个环节可能会有哪些技术问题?


然后应该针对这些技术挑战和技术问题,现场给出一些你的思路。只要给出大致的思路就可以,比如应该往哪个方向去解决,应该引入哪些机制。


说实话,大部分人是没实际做过这类系统的。比如让你设计一个秒杀系统,如何设计?


试问,国内有多少人真的做过秒杀系统?其实面试官只不过是通过这个问题考察你的技术面、技术功底,对各种常规技术方案的积累,以及现场分析业务,分析技术问题,进而基于你过去的技术积累,给出合理解决方案的一个能力。


这种能力,是一个高级 Java 工程师必须具备的能力,因为如果你是一个有 5 年以上经验的高级工程师,那你必须在团队里能独立负责一个系统。


此时你必须有这个能力,对项目面临的问题,要能够分析业务,分析技术问题,然后给出合理的技术方案和架构设计。


作者简介


原子弹大侠,阿里高级技术专家


经历过每日百亿流量的互联网系统架构,尤其对上亿用户场景下的高并发系统架构设计以及性能优化相关领域有深入的研究。


2020-06-20 18:363554

评论

发布
暂无评论
发现更多内容

「案例分享」研发效能提升之第一性原理

京东科技开发者

redis flink 研发管理 研发效能 软件开发技术的第一性原理

融云全球社交泛娱乐洞察,互联网社交换挡期的「社区产品」机遇

融云 RongCloud

社交 社区

Tiktok短视频搬运运营干货技巧

极客天地

膜拜!华为18级工程师用349页构建高可用Linux服务器,其实并不难

小二,上酒上酒

Java Linux 学习 华为 运维

有位大牛终于把珍藏多年的算法视频给分享出来了,总共3.81G

小二,上酒上酒

算法 数据结构与算法 左程云

支持向量机-线性SVM决策过程的可视化

烧灯续昼2002

Python 机器学习 算法 sklearn 11月月更

前端培训学习的前景怎么样

小谷哥

java培训学习有什么好的方法

小谷哥

终于有阿里大牛把困扰我多年的计算机组成原理:网络通信讲明白了

小二,上酒上酒

计算机 计算机原理 TCP协议

从发现问题到创造价值 数据智能如何助力商家双11高质量增长?

阿里技术

数据分析 智能数据

云原生加速器企业维格表创始人陈霈霖:提供人人可用的数字化转型全新方案,真正驱动组织创新

阿里巴巴云原生

阿里云 云原生 维格表

大数据培训后找不到工作的原因有哪些?

小谷哥

年薪120W的架构师简历你见过吗?java程序员该如何达到?

小二,上酒上酒

学习 架构 简历规划

干货 | 带你了解 EMC—— 什么是 EMC?

元器件秋姐

电磁兼容 元器件电商 华秋商城 电子工程师 电子科普

前端培训机构需要注意什么?

小谷哥

终于学完阿里架构师推荐413页微服务分布式架构基础与实战笔记

小二,上酒上酒

Java 面试 分布式 微服务

The camera application scenrios on Wallys DR40X9 ipq4019/ipq4029 industrial 5g router

wallysSK

IPQ4019 ipq4029

新发现,新挑战,技术出海的机遇与挑战丨PingCAP DevCon 2022 出海专场

PingCAP

出海

AirServer2023个人免费版本下载

茶色酒

AirServer2023

既快又稳还方便,火山引擎VeDI的这款产品解了分析师的愁

字节跳动数据平台

大数据 数据分析

我说用count(*)统计行数,面试官让我回去等消息...

小小怪下士

Java sql 程序员

Camtasia2023全新版下载及功能介绍讲解

茶色酒

Camtasia2023

前端培训程序员失业后就业方向有哪些

小谷哥

WOS新商业操作系统:中国头部SaaS的一次进阶

ToB行业头条

高级Java面试经验总结:多家大厂简历优化+面试题目+面经+薪酬等

钟奕礼

Java 程序员 java面试 java编程

数字化安全生产平台 DPS 重磅发布

阿里巴巴云原生

阿里云 云原生 数字化

听说,清华毕业大牛分享出Redis实战视频及文档,共2.3G

小二,上酒上酒

Java redis 学习路线

存算一体 VS 存算分离 ,IT发展下的技术迭代

StoneDB

数据库 开源 存算分离 HTAP StoneDB

2023最新FL Studio中文版64位安装包下载教程

茶色酒

FL Studio FL Studio 21

荣耀MagicOS 7.0正式发布!打造以人为中心的智慧生活解决方案

荣耀开发者服务平台

手机 系统 安卓 荣耀 honor

三面阿里,被Java面试官虐哭!现场还原真实的“被虐”场景

小二,上酒上酒

面试题 面经 大厂面试 春招

如何设计一个电商平台积分兑换系统?_文化 & 方法_技术琐话_InfoQ精选文章