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

2023-10-29

目录

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

2.业务需求描述    

3.对业务流程的思考    

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

5.事务的保证    

6.消息中间件的引入    

7.重试机制的引入    

8.引入幂等性机制    

9.对这类面试题的总结    

 

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年以上经验的高级工程师,那你必须在团队里能独立负责一个系统。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何设计一个电商平台积分兑换系统? 的相关文章

  • 分布式事务学习总结

    1 基础概念 1 1 什么是事务 事务可以看做是一次大的活动 它由不同的小活动组成 这些活动要么全部成功 要么全部失败 1 2 本地事务 在计算机系统中 更多的是通过关系型数据库来控制事务 这是利用数据库本身的事务特性来实现的 因此叫数据库
  • 万亿条数据查询毫秒级响应

    深入探讨如何在如此大量的数据上保持毫秒级的查询响应时间 以及 TiDB 是一个开源的 MySQL 兼容的 NewSQL 混合事务 分析处理 HTAP 数据库 如何为我们提供支持获得对我们数据的实时洞察 系统架构要求 知乎的 Post Fee
  • 库存系统难破题?且看京东到家如何破

    京东到家库存系统架构设计 目前 京东到家库存系统经历两年多的线上考验与技术迭代 现服务着万级商家十万级店铺的规模 需求的变更与技术演进 我们是如何做到系统的稳定性与高可用呢 下面将会给你揭晓答案 库存系统技术架构图 上图如果进行总结下 主要
  • Encode and Decode TinyURL

    TinyURL is a URL shortening service where you enter a URL such as https leetcode com problems design tinyurl and it retu
  • 基于单片机的水温液位监测系统设计(#0513)

    在现代工业生产中 常常需要测量容器中液体的液位 在一般的生产过程中 液位测量的目的主要是通过液位测量来确定容器里的原料 半成品或产品的数量 以保证生产过程各环节物料平衡以及为进行经济核算提供可靠的依据 另外还为了在连续生产的情况下 通过液位
  • 如何设计一个电商平台积分兑换系统?

    目录 1 拉开差距的一类面试题 2 业务需求描述 3 对业务流程的思考 4 物流配送进度查询 考虑到了吗 5 事务的保证 6 消息中间件的引入 7 重试机制的引入 8 引入幂等性机制 9 对这类面试题的总结 1 拉开差距的一类面试题 现在面
  • java枚举的集中管理

    java枚举的集中管理 一 产品中遇到的实际情况 枚举类泛滥 这个 这个 这个 这个 在 JDK 1 5 之前没有枚举类型 那时候一般用接口常量来替代 而使用 Java 枚举类型 enum 可以更贴近地表示这种常量 但是在项目中 就变成这样
  • 完全详解权限系统设计方案

    1 为什么需要权限管理 日常工作中权限的问题时时刻刻伴随着我们 程序员新入职一家公司需要找人开通各种权限 比如网络连接的权限 编码下载提交的权限 监控平台登录的权限 运营平台查数据的权限等等 在很多时候我们会觉得这么多繁杂的申请给工作带来不
  • Java面试八股文 - 掌握面试必备知识(目录篇)

    目录 1 准备篇 1 1 Java面试概述 1 2 面试流程和注意事项 1 3 自我介绍及项目介绍 1 4常见面试问题 2 Redis篇 2 1 Redis简介和特点 2 2 Redis数据类型及其应用 2 3 Redis持久化机制 2 4
  • 分布式数据库、NoSql 与 zookeeper

    分布式数据库 数据高可用 分布式数据库系统通常使用较小的计算机系统 每台计算机可单独放在一个地方 每台计算机中都可能有DBMS的一份完整拷贝副本 或者部分拷贝副本 并具有自己局部的数据库 位于不同地点的许多计算机通过网络互相连接 共同组成一
  • 升级log4j2遇到的那些坑

    升级log4j2遇到的那些坑
  • MySQL数据同步ES的4种方法,你能想到几种?

    大家好 我是老三 这期给大家分享一个电商中常见的场景 MySQL数据同步Elasticsearch 大家应该都在各种电商网站检索过商品 那么检索商品一般都是通过什么实现呢 搜索引擎Elasticsearch 那么问题来了 商品上架 数据一般
  • 京东到家技术解密

    京东到家技术解密 京东到家相信很多人都听过 是一个短短两年内依靠技术与产品崛起的公司 其中项目的划分 技术的选型又是怎么样子呢 本课程目标用户群体是工作过几年的攻城狮 在项目中取得了一定的成就 但是缺少O2O 电商 新零售领域的工作经验 却
  • 软件系统设计步骤与原理

    软件系统设计步骤与原理 在系统分析阶段 我们已经搞清楚了系统做什么的问题 其中最主要的是需求分析 确定用户需求 功能需求 系统性能 系统安全等方面的需求 数据流图 可以确定数据需求与转换过程 那么在系统设计阶段 就是着手实现需求的过程 即解
  • springcloud 总 架构图

    版权所有 转载 请表明出处 相关代码地址 欢迎到我的网站寻找更多的知识
  • 团队的技术专家回老家了,留下的技术设计模板贼好用

    大家好 我是老三 转眼间 团队的技术专家B哥 已经离职一年了 我还时不时会想起他 因为他留下的j技术设计模版 我觉得真的很好用 基本上涵盖了设计需要考虑的方方面面 接下来 以一个CRM项目的用户触达模块为例 给大家分享一下 一 CRM 技术
  • 带你认识一下“京东到家-网关系统”

    京东到家三周年活动已然结束 在这2年里 我们的网关系统经历过了618 1020 双11 双12 415等多个非常有意义的考试 回顾起来依旧让人觉得很刺激 每次考前我们和市场部都做了大量的效果预估 压测 扩容 但是活动当日依旧是惊心动魄 瞬时
  • 基于RBAC模型的权限设计思路

    一 RBAC模型 进行设计前 最好能够理解技术模型 在业界接受度较高的功能权限模型是RBAC Role Based Access Control 模型 其基本理念是将 角色 这个概念赋予用户 在系统中用户与权限之间通过角色进行关联 以这样的
  • 高并发应用实践——缓存简介

    简介 随着互联网的普及 内容越来越复杂 用户和数据量越来越大 所以我们的应用应该支持更高的并发数 但是由于我们的服务器和数据库服务器资源量是有限的 所以如何更加高效的利用这有限的资源 并提供尽可能大的数据吞吐量 一个有效可行的办法就是引入缓
  • 为什么我的对话框创建失败了?菜鸟错误1

    对话框中的资源要么被定义为一个整数 要么被定义为一个字符串 仅仅一个简单的错误将会将其中的一个类型错误的变成另一个类型 我们来看一个例子 gt gt 请移步至 www topomel com 以查看图片 lt lt 你是否能发现其中的两处

随机推荐

  • nestjs知识系列:nest工程升级

    参考 Is there a recommended way to update NestJS Stack Overflow 实操 我从nestjs7升到9 实际上无法一键升级 可以略过 如果你不想更改全局 先npm install g ne
  • java/Springboot项目把Base64数据转为文件

    前言 以下记录如何将base64的数据转为文件保存在本地 依赖 pom xml需要导入以下依赖
  • worker 多线程

    Web Worker 的作用 就是为 JavaScript 创造多线程环境 允许主线程创建 Worker 线程 将一些任务分配给后者运行 在主线程运行的同时 Worker 线程在后台运行 两者互不干扰 等到 Worker 线程完成计算任务
  • mybatis学习(27):获取自增id方式一(在mapper中insert配置节点的属性)

    目录结构 com geyao mybatis mapper BlogMapper类 package com geyao mybatis mapper import java util List import java util Map im
  • TVM User Tutorial -- Blitz Course to TensorIR

    Author Siyuan Feng TensorIR 是一种特定领域语言 用于深度学习项目 有两个广泛的用途 在各种硬件后端上实现转换和优化程序 自动张力化程序优化的抽象 import tvm from tvm ir module imp
  • 一个可执行程序的组成

    一个可执行程序由四个区域组成 代码段 静态数据区 堆和栈 代码段包含程序运行时多执行的部分变量 静态数据区包含在程序生命周期内一直持久的数据 比如全局变量和静态局部变量 堆包含程序运行时动态分配的存储空间 比如用malloc分配的内存 栈包
  • mybatis使用时出现:对实体 “useSSL“ 的引用必须以 ‘;‘ 分隔符结尾问题的解决方法

    文章目录 问题描述 解决方法 问题描述 最近在学习mybatis 访问数据库时idea报错 解决方法 后来查了一下才发现 原来在 xml文件中写 符号时会引起冲突 需要把 改为 amp 才行 下面这个代码报错
  • 手把手带你打造自己的UI样式库(第三章)之常用样式组件的设计与开发

    常用样式组件的设计与开发 Search搜索框样式的设计与开发 搜索组件的需求 搜索框的功能比较简单 最基本的就是输入和提交两个逻辑 但是我们这个搜索框要额外的加一些细节 输入框分为输入状态和非输入状态 两种状态下输入框表现要有所不同 我们对
  • 虚拟机内部错误如何解决·?

    a 因为上一次开机是可以使用的 故初步推测是vm服务关闭所致 按住win R输入cmd打开cmd命令行 a 输入services msc进入服务界面 找到vm开头的服务 启动
  • 将本地的公钥复制到服务器的authorized_keys文件

    ssh git ip cat gt gt ssh authorized keys lt ssh id rsa pub
  • 1.4 ROS集成开发环境搭建

    ROS入门学习 1 4 ROS集成开发环境搭建 ROS入门教程 理论与实践 视频教程镇楼 和大多数开发环境一样 理论上 在 ROS 中 只需要记事本就可以编写基本的 ROS 程序 但是工欲善其事必先利其器 为了提高开发效率 可以先安装集成开
  • Android中OkHttp的使用(详解)

    1 先在项目中添加OkHttp库的依赖 dependencies compile com squareup okhttp3 okhttp 3 4 1 2 初始化 OkHttp框架的核心类是OkHttpClient 此类可直接实例化 由于Ok
  • 基于python,虹软sdk3.0实现的实时人脸识别

    前言 虹软sdk3 0是目前用过的最方便 效果最好的且免费的离线人脸识别SDK 提供的编程语音没有python 有大佬用c 代码接口转成python调用的 我在此基础上完善了一些功能 能够实现高精度多人脸实时人脸识别 并提供了年龄 性别识别
  • 用ChatGPT一分钟自动产出一份高质量PPT

    如何用ChatGPT一分钟自动产出一份高质量PPT 节约时间摸鱼呢 废话少说 直接上案例 一 用ChatGPT做一下提问 这里我用的小程序万事知天下 根据自己PPT的需求 制作chatgpt的prompt就行了 请帮我创建一个以 大学生如何
  • csv修改单元格格式后无法保存_Excel教程——excel如何使用条件格式?

    Microsoft excel条件格式可是你分析数据的好帮手 但该如何査看和分析这些数据呢 macw小编带来了excel如何使用条件格式的教程 希望对你有帮助 这款excel Mac版有一项常常被忽视 却非常实用的工具 条件格式 它能自动根
  • XMind思维导图介绍与下载安装使用教程

    文章目录 介绍 下载 安装 千人全栈VIP答疑群推荐 介绍 XMind 是一款非常实用的商业思维导图软件 应用Eclipse RCP 软件架构 打造易用 高效的可视化思维软件 强调软件的可扩展 跨平台 稳定性和性能 致力于帮助用户提高生产率
  • imos v5 web api说明文档_B站视频api整理

    此文档为非官方接口文档 无法保证接口有效性 以下接口为本项目目前使用的接口 也可以直接看src api 文件目录下的接口 仿B站视频网站项目源码 进入项目源码仓库 首页模块 推荐视频 https www bilibili com index
  • JDBC 和数据库连接

    JDBC 和数据库连接 基本介绍 JDBC为访问不同的数据库提供了统一的接口 为使用者屏蔽了细节问题 Java程序员使用JDBC 可以连接任何提供了JDBC驱动程序的数据库系统 从而完成对数据库的各种操作 JDBC的基本原理图 重要 JDB
  • core audio采集音频

    涉及的接口有 IMMDeviceEnumerator IMMDevice IAudioClient IAudioCaptureClient 主要过程 创建多媒体设备枚举器 IMMDeviceEnumerator 通过多媒体设备枚举器获取声卡
  • 如何设计一个电商平台积分兑换系统?

    目录 1 拉开差距的一类面试题 2 业务需求描述 3 对业务流程的思考 4 物流配送进度查询 考虑到了吗 5 事务的保证 6 消息中间件的引入 7 重试机制的引入 8 引入幂等性机制 9 对这类面试题的总结 1 拉开差距的一类面试题 现在面