设计一个电商平台的积分兑换系统

凌波微步_大先生 凌波微步_大先生     2022-12-23     765

关键词:

1、业务需求的描述

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

用户在电商平台里平时通过购买商品、晒单评论可以有不断的积累积分积累到足够的积分后,就可以在电商平台的积分兑换页面中,选择使用自己的积分来兑换一些礼品。

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

 

2、对业务流程的思考

 

如何思考?首先,用户不停的购买商品以及晒单评论,会不断的获取积分,那么是不是需要一张积分表,专门用来存储每个用户的积分呢?没错,这个表是一定需要的,可以现场给出下述的表结构。

 

积分表

 

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)

 

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

 

 

 

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

 

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

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

当然不是!

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

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

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

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

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

发货申请表

id(自增id主键)

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

credit_exchange_id(积分兑换表的id)

product_id(要发货的商品id)

express_no(物流单号)

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

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

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

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

 

 

 

 

4、事务的保证

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

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

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

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

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

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

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

这个流程如下所示:

        积分服务 事务

               -> 扣减积分

               -> 新增积分兑换记录

            -> 调用仓储服务

        

5、消息中间件的引入

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

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

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

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

 

 

6、重试机制的引入

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

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

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

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

具体的流程如下:

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

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

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

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

 

 

 

7、引入幂等性机制

 

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

 

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

 

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

 

发货申请表

 

id(自增id主键)

 

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

 

credit_exchange_id(积分兑换表的id)

 

product_id(要发货的商品id)

 

express_no(物流单号)

 

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

 

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

 

 

 

 

 

 

38生鲜电商平台-会员积分系统的设计与架构

...好的提升用户的粘性及活跃度。一、互联网平台积分体系设计必要性互联网平台积分体系是一个独立、完整的系统模块,主要用于激励和回馈用户在平台的消费行为和活动行为,通过积分体系可以激发与引导用户在平台的活跃行... 查看详情

设计模式简记-设计符合设计原则的业务系统之需求分析

3.9实战一:业务系统开发,如何做需求分析和设计3.9.1需求分析(积分系统)借鉴类似产品技术人也要有产品思维要懂得借鉴:爱因斯坦:“创造的一大秘诀是要懂得如何隐藏你的来源”两大功能:赚取积分;消费积分赚取积分积... 查看详情

36生鲜电商平台-积分,优惠券,会员折扣,签到预售拼团砍价秒杀及抽奖等促销模块架构设计

...常见的促销方案,目前贴出实际的业务运营手段以及架构设计,包括业务说明,仅供参考 促销体系1.1促销体系在电商和O2O领域,促销是运营人员的一个主要的让利行为,同时促销活动期间的购买量也较之普通商品更高,不同... 查看详情

积分兑换商城的特点是什么?搭建积分商城如何助力企业培养高粘性的用户群体?

...目的,数商云可为商家搭建专属的会员积分商城系统平台,打破地域、空间的局限,为商家提供更多的消费者资源,提高企业效益。会员积分商城系统的特点介绍1、通过会员积分商城系统平台,无论是优惠券... 查看详情

如何保证分布式系统的消息最终一致性

参考技术A针对楼主的问题:下面我们以电商购物支付流程中,在各大参与者系统中可能会遇到分布式事务问题的场景进行详细的分析!如上图所示,假设三大参与平台(电商平台、支付平台、银行)的系统都做了分布式系统架... 查看详情

15生鲜电商平台-售后模块的设计与架构(代码片段)

说明:任何一个的电商平台都有售后服务系统,那么对于我们这个生鲜的电商平台,售后系统需要思考以下几个维度。      1.买家的需求维度       说明:买家在平台上没找到自己... 查看详情

微服务架构的分布式事务问题如何处理?

分布式系统架构中,分布式事务问题是一个绕不过去的挑战。而微服务架构的流行,让分布式事问题日益突出!下面我们以电商购物支付流程中,在各大参与者系统中可能会遇到分布式事务问题的场景进行详细的分析!如上图所... 查看详情

26生鲜电商平台-rbac系统权限的设计与架构

...角度上分析实现的策略以及基于目前两种比较流行的权限设计思想来讨论关于权限系统的实现。1.1.      技术策略l        查看详情

华住酒店会员怎样用积分兑换房间

...。一、简介:华住会,是华住酒店集团会员俱乐部,也是一个高效、简单、温情的酒店预订平台,满足从高端到平价、商务与休闲的多元化需求,为全球超过1亿会员提供住宿、出行、购物等服务,是您聪明、温暖、长情的出行... 查看详情

电商平台支付结算系统设计-产品向

参考技术A写在前面:这篇文章是笔者近期学习支付相关知识,在知乎、人人都是产品经理、掘金等等各个地方拜读各位大神大作后,梳理摘录汇总而成,仅供自己学习备忘,如有冒犯还请指出,谢谢~整体分为交易系统(OMS)、... 查看详情

130242014067“电商系统购物车功能模块”需求分析与设计实验课小结

...工合作情况介绍。陈锋、刘鑫(用户故事的细化,即功能设计)高忠杰、罗成龙(参与系统的类图设计及上台汇报)颜贵荣、李清灿(参与用户故事的讨论与设计)王绍华、丁天奇、林伟领(参与系统的类图设计并选定课题)2... 查看详情

“购物返现积分兑换”——区块链思维的购物返利方式

商业运营模式只是一个让商家提高销售额的一种手段,不管线上还是线下都是一样的。例如:买二送一、转介绍购优惠、新人促销价这些,这都是非常普遍的的营销商业运营模式,大部分每一个线下推广实体线店... 查看详情

基于javaspringboot+mybatis电商书城平台系统设计和实现

java毕业设计项目《100套》推荐主要实现了书城网站的浏览、加入购物车操作、订单操作、支付操作、分类查看、搜索、以及后台上传图书信息以及订单管理和一些基本操作功能摘要信息:随着市场经济的逐渐形成,全球 查看详情

什么是虚拟币钱包,虚拟币交易平台怎么开发?

区块链作为一种用于记录、追踪、检测、转移所有资产的数据库和库存清单。可以用于金融、经济和金钱,有形资产和无形资产等各个领域。区块链的最大贡献是建立去中心化的信任机制。数字积分,在不同的人类行为中,赋予了... 查看详情

django计算机毕业设计基于安卓android的移动电商平台系统app-商品购物商城app

项目介绍网络的广泛应用给生活带来了十分的便利。所以把移动电商平台与现在网络相结合,利用python技术建设移动电商平台APP,实现移动电商平台的信息化。则对于进一步提高移动电商平台发展,丰富移动电商平台... 查看详情

vivo全球商城:电商交易平台设计(代码片段)

本文介绍了交易平台的设计理念和关键技术方案,以及实践过程中的思考与挑战。作者:vivo官网商城开发团队-ChengKun、LiuWei本文介绍了交易平台的设计理念和关键技术方案,以及实践过程中的思考与挑战。点击查阅:《vivo全球... 查看详情

区块链数字货币积分交易系统设计开发与搭建

数字积分与数字资产开发技术区块链的应用场景十分广泛,目前区块链项目众多,多数都以搭建具体场景的应用为主。区块链技术还处于发展初期,很多基础技术需要演进,解决基础问题在技术实现上比很多应用型项目更有挑战... 查看详情

用户运营中的积分系统如何设计?

对于互联网行业,可能很多人脑中没有一个成型的互联网体系,都很零散,做过的工作也不成系统。很多人会问:互联网平台做运营是做什么?其实不管是什么公司,互联网运营是最复杂的工作,因为运营覆盖的范围和内容很... 查看详情