电商系统架构设计系列(一):电商系统到底是如何设计出来的?

news2024/11/20 7:19:03

引言

  • 电商这个业务,和我们的生活息息相关。你可能对电商多少有一些了解,但是,即使是一个最小化的电商系统,它仍然非常复杂。
  • 在这个系列的文章里,我们将一起以一个创业公司的 CTO 的视角,来设计一个最小化的电商系统。在这个过程中,从0到1,帮你理清楚整个电商系统的架构设计。

我们的故事从一个电话开始。

某一天,一个曾经认识但并不太熟悉的老板,突然来了一个电话:

“我有一个改变世界的想法,就差一个程序员了!你来吧!”

新公司很快就成立了,你成了新公司的 CTO。

关于要如何改变世界,目前唯一能确定的是,老板要做一个电商系统。具体做成什么样,还不清楚。你需要和老板讨论需求。

你:“咱们要做的业务模式是 C2C、B2C 还是 B2B 呢?”

老板:“什么 B?什么 C?我不懂你们那些技术的东西。”

你:“这么说吧,你要山寨,啊不对,做一个某宝网,还是某东网,还是某 848 网呢?”

老板:“不都是一样的么?有什么区别?你赶紧做一个出来我看看不就知道了?!”

有没有感觉似曾相识?作为研发,谁没碰到过几个啥也不懂的需求方不是?

那这种情况下,你怎么办呢?

在需求还不太明确的情况下,比较可行的方式就是,先把那些不太会变化的核心系统搭建出来,尽量简单地实现出一个最小化的系统,然后再逐步迭代完善。

电商系统的核心流程是什么样的?

接下来我们一起来设计这个电商的核心系统。

遵照软件工程的一般规律,我们先从需求阶段开始。

如何来做需求分析?

理想情况下,应该由系统分析师或者是产品经理来承担这个任务。但现实很骨感,绝大多数情况下,你得到的所谓的“需求”,就是一两句话。需求分析的工作实际上就落在了开发者身上。

很多项目交付以后,还要改来改去,用户不满意,开发者很痛苦,其实就是缺失了需求分析这个步骤。所以,为了自己,每一个开发者都应该掌握一点需求分析的方法。

开发者怎么来做需求分析?这里面我们不讲那些做需求分析的方法和理论,只告诉你最重要、最关键的一个点。

不要一上来就设计功能,而是先要回答下面这两个问题:

  1. 这个系统(或者是功能)是给哪些人用的?
  2. 这些人使用这个系统来解决什么问题?

这两个问题的答案,我把它们称为业务需求。

在我们将要设计的这个电商系统中,它的业务需求是什么?电商的业务,每个人都熟悉,很容易回答这两个问题。

第一个问题,电商系统给哪些人用?

首先得有买东西的人,我们叫“用户”,还得有卖东西的人?我们叫“运营人员”。还有什么人会用这个系统?老板啊!你记住,你在设计任何一个系统的时候,千万不要把老板或者是领导给忘了,他们是给你钱的人,他们的意见非常重要!

然后我们一起回答:

第二个问题:用户、运营和老板,分别用电商系统来干什么?

这个问题也很容易回答,用户用系统来买东西,运营用系统来卖东西,老板需要在系统中看到他赚了多少钱。

这两个问题的答案,或者说是业务需求,稍加细化后,可以用下面这个图来清晰的表述:

 这个图在 UML(统一建模语言)中称为用例图(Use Case),是需求分析的时候你需要画的第一张图。它回答的就是,业务需求中的那两个关键的问题,这个系统给谁用?他们用这个系统解决什么问题?

一般来说,业务需求和我们要设计的系统关系不大。

为什么这么说呢?你可以看一下上面这个图里面的用例,放在传统的商业企业里面,比如一个小杂货铺、一个线下实体商场商店或者一个做电视购物的公司,是不是也是适用的?

所以,做业务需求的主要目的,是理清楚业务场景是什么样的。

然后我们来分析电商系统的流程。

显然,一个电商系统最主要的业务流程,一定是购物这个流程。你应该很容易就能把这个流程分析出来,它的流程图是这样的:

 所有的电商几乎都是这样一个流程,我和你一起来看一下这个流程。

  1. 流程从用户选购商品开始,用户先从你的 App 中浏览商品;
  2. 找到心仪的商品之后,把商品添加到购物车里面;
  3. 都选好了之后,打开购物车,下一个订单;
  4. 下单结算之后,就可以支付了;
  5. 支付成功后,运营人员接下来会给每个已经支付的订单发货;
  6. 邮寄商品给用户之后,用户确认收货,到这里一个完整的购物流程就结束了。

如何根据流程来划分功能模块?

接下来,我们把这个业务流程再细化,看一下电商系统如何来实现这个流程?细化之后的流程,绘制成了下面这个时序图(Sequence Diagram):

 我们一起看下这个时序图中的每个步骤。

  1. 用户开始浏览商品,需要有一个商品模块来支撑,给用户展示商品的介绍、价格等等这些信息。
  2. 用户把选好的商品加入购物车,这个步骤,也需要一个购物车模块来维护用户购物车中的商品。
  3. 用户下单肯定需要一个订单模块来创建这个新订单。订单创建好了之后,需要把订单中的商品从购物车中删除掉。
  4. 订单创建完成后,需要引导用户付款,也就是发起支付流程,这里需要有一个支付模块来实现支付功能,用户成功完成支付之后,需要把订单的状态变更为“已支付”。
  5. 之后运营人员就可以发货了,在系统中,发货这个步骤,需要扣减对应商品的库存数量,这个功能需要库存模块来实现,发货完成后,还需要把订单状态变更为“已发货”。
  6. 最后,用户收货之后,在系统中确认收货,系统把订单状态变更为“已收货”,流程结束。

这个流程涉及到的功能模块有:商品、购物车、订单、支付和库存,这几个模块就是一个电商系统中的核心功能模块。

当然,仅仅有这几个模块还是不够的,因为我们只分析了“购物”这个最主要的流程,并没有完全涵盖业务需求中的全部用例,比如:运营人员进货、老板查看报表这些用例还没有覆盖到。

相比购物这个流程,剩下的几个用例和流程都没那么复杂,用同样的方法就可以把其他功能模块分析出来。

在这里,我们就省略分析过程,直接给出我们电商系统的功能模块划分:

上面这个图,使用的是 UML 中的包图 (Package Diagram) 来表示。

整个系统按照功能,划分为十个模块,除了购物流程中涉及到的:商品、订单、购物车、支付、库存五个模块以外,还补充了促销、用户、账户、搜索推荐和报表这几个模块,这些都是构建一个电商系统必不可少的功能。

我们一个一个来说每个模块需要实现的功能。

  1. 商品:维护和展示商品信息和价格。
  2. 订单:维护订单信息和订单状态,计算订单金额。
  3. 购物车:维护用户购物车中的商品。
  4. 支付:负责与系统内外部的支付渠道对接,实现支付功能。
  5. 库存:维护商品的库存数量和库存信息。
  6. 促销:制定促销规则,计算促销优惠。
  7. 用户:维护系统的用户信息,注意用户模块它是一个业务模块,一般不负责用户登录和认证,这是两个完全不同的功能。
  8. 账户:负责维护用户的账户余额。
  9. 搜索推荐:负责商城中,搜索商品和各种列表页和促销页的组织和展示,简单的说就是决定让用户优先看到哪些商品。
  10. 报表:实现统计和分析功能,生成报表,给老板来做经营分析和决策使用。

这里面需要特别说一下促销模块,它是电商系统中,最复杂的一个模块。

各种优惠券、满减、返现等等这些促销规则,每个都非常复杂,再加上这些规则叠加计算,常常是复杂到连制定促销规则的人都搞不清楚。

所以,每个电商公司无一例外都爆出过,因为促销规则制定失误,而产生非常便宜的“羊毛单”,让精明的消费者薅了“羊毛”。不过五花八门的促销是提升销售最有效的手段,肯定不能因噎废食。

作为系统设计者,我们需要把促销的变化和复杂性封禁在促销模块内部,不能让一个促销模块把整个电商系统都搞得非常复杂,否则就很难去设计和实现。

可行的做法是,把促销模块与其他模块的接口设计的相对简单和固定,这样系统的其他模块就不会因为新的促销玩儿法而改变。

最终生成的订单中,只记录订单使用了哪几种促销,以及最终的促销价就可以了。这样,不管促销这个模块的玩儿法怎么变化,订单和其他模块的业务逻辑不需要随之改变。

关于促销,还有一个点在实际运营的电商系统中,也需要经常考虑到:要在订单中要存储每个商品所均分的促销价

比如A商品100元,B商品100元,用户买了一件A+一件B,激发了一个促销满200减10元,则每个商品均摊5元。核心是为了在做单件售后的时候,计算出首先对应的金额。

至此,我们就完成了一个电商系统的概要设计,你应该对电商系统也有了一个初步的了解了。

总结

我们一起回顾一下:一个电商系统的设计中,最核心的几个关键点。

首先,系统的角色是:用户、运营人员和老板。这三个角色对电商系统的需求是:用户使用系统来购物,运营人员负责销售商品,老板关注系统中经营数据。电商系统最核心的流程就是用户购物的流程,流程从用户浏览选购商品开始,加购、下单、支付、运营人员发货、用户确认收货,至此流程结束。

细化这个流程之后,我们可以分析出,支撑这个流程几个核心的功能模块:商品、订单、购物车、支付和库存。此外,还需要促销、用户、账户、搜索推荐和报表这些必备的功能模块支撑,才能构成一个完整的电商系统。

还分享了作为一个开发者,你在做需求分析的时候,需要把握的一个要点:不要一上来就设计功能,而是要先理清业务需求,先回答两个问题:这个系统是给哪些人用的?他们分别用这个系统来解决什么问题?这样可以确保你做出来的系统,大体上不会偏离用户的预期。

最后,在系统功能模块划分时,分享了一个有效减少系统复杂度的设计经验。那就是,如果系统业务是复杂而多变的,尽量识别出这部分复杂业务的边界,将复杂封禁在一个模块的内部,避免这种复杂度扩散到整个系统中去。

思考题

做完了概要架构设计,就可以来做技术选型了。

作为公司的 CTO,请你思考一下,这个电商系统的技术选型应该是什么样的?

  1. 使用什么编程语言和技术栈?
  2. 需要哪些第三方的框架和云服务?
  3. 存储系统该怎么选型?

期待、欢迎你留言或在线联系,与我一起讨论交流,“一起学习,一起成长”。


推荐阅读

  • 架构师:不想当架构师的程序员不是好程序员
  • 架构师技能修炼图
  • 技术破局,业绩狂飙十倍:亿级电商平台重构大揭秘
  • 当我们聊高并发时,到底是在聊什么?如何真正地掌握高并发设计能力?
  • 【总结】我的十二个架构设计原则
  • 微服务架构实战 - 我的经验分享总结2019(系统架构师)架构演进过程-从信息流架构到电商中台架构​​​​​​

系列分享

  • 高可用高并发实战专栏
  • DevOps实战专栏
  • SpringBoot系列专栏
  • 微服务架构实战
  • 架构思维成长系列

------------------------------------------------------

------------------------------------------------------

我的CSDN主页

关于我(个人域名,更多我的信息)

我的开源项目集Github

期望和大家 一起学习,一起成长,共勉,O(∩_∩)O谢谢

如果你有任何建议,或想学习的知识,可与我一起讨论交流

欢迎交流问题,可加个人QQ 469580884,

或者,加我的群号 751925591,一起探讨交流问题

不讲虚的,只做实干家

Talk is cheap,show me the code

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/444474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习实战26-(Pytorch)搭建TextCNN实现多标签文本分类的任务

大家好,我是微学AI,今天给大家介绍一下深度学习实战26-(Pytorch)搭建TextCNN实现多标签文本分类的任务,TextCNN是一种用于文本分类的深度学习模型,它基于卷积神经网络(Convolutional Neural Networks, CNN)实现。TextCNN的主要思想…

C语言实现链表--数据结构

魔王的介绍:😶‍🌫️一名双非本科大一小白。魔王的目标:🤯努力赶上周围卷王的脚步。魔王的主页:🔥🔥🔥大魔王.🔥🔥🔥 ❤️‍&#x1…

gateway整合knife4j(微服务在线文档)

文章目录 knife4j 微服务整合一、微服务与单体项目文档整合的区别二、开始整合1. 搭建一个父子maven模块的微服务,并引入gateway2.开始整合文档 总结 knife4j 微服务整合 由于单个服务的knife4j 整合之前已经写过了,那么由于效果比较好,然后微服务的项目中也想引入,所以开始微…

【Linux】多线程的互斥与同步

目录 一、线程冲突 二、重入与线程安全 1、线程不安全的情况 2、线程安全的情况 3、不可重入的情况 4、可重入的情况 5、可重入和线程安全的联系 6、STL是否线程安全 7、智能指针是否线程安全 三、互斥锁 1、互斥锁的使用 2、基于RAII风格的互斥锁的封装 2.1Mutex…

ChatGPT-4回答电子电路相关问题,感觉它有思想,有灵魂,一起看看聊天记录

前几天发了一篇文章,讲了我们平常摸电脑或者其它电器设备的时候,会有酥酥麻麻的感觉,这个并不是静电,而是Y电容通过金属壳泄放高频扰动,我们手摸金属壳的时候,就给Y电容提供了一个泄放回路,所以…

全网抓包天花板教程,CSDN讲的最详细的Fiddler抓包教程。2小时包你学会

目录 前言 一、安装 Fiddler 二、打开 Fiddler 并设置代理 三、抓取 HTTP/HTTPS 流量 四、流量分析和调试 五、应用场景 六、注意事项 七、实际案例 八、拓展阅读 九、结论 前言 Fiddler 是一款功能强大的网络调试工具,可以用于捕获和分析 HTTP 和 HTTPS …

生物信息学有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是几个生物信息学领域的SCI期刊推荐: Bioinformatics: 该期刊是生物信息学领域最具影响力的SCI期刊之一,涵盖了生物信息学、计算生物学、系统生物学、生物医学工程等多个研究方向。 BMC Bioinformatics: 该期刊是生物信息学…

数据结构入门(C语言版)二叉树链式结构的实现

二叉树链式结构的实现 二叉树的概念及结构创建1、概念2、结构创建2、创建结点函数3、建树函数 二叉树的遍历1、前序遍历2、中序遍历3、后序遍历4、层序遍历 二叉树的销毁结语 二叉树的概念及结构创建 1、概念 简单回顾一下二叉树的概念: ★ 空树 ★非空&#xff1…

intellij 从2020升级到2023 踩坑实录

1.下载新版本intellij 工作机器上的intellij版本为2020社区版,版本比较老旧,需要进行升级。IDE这种提高生产力的工具,还是蛮重要的,也是值得稍微多花点时间研究一下的。升级之前就预计到了不会是那么简单,后面事实也证…

大型体检管理系统源码,Vs2012,C/S架构

体检管理系统源码,PEIS源码 一套专业的体检管理系统源码,核心功能有体检档案的录入、体检报告的输出、体检档案的统计查询和对比分析。该系统的使用,可以大大提高体检档案管理人员的工作效率,使体检档案的管理更加准确、全面、完…

以人为本的重点是有效网络安全计划的关键

安全和风险管理 (SRM) 领导者在根据九大行业趋势创建和实施网络安全计划时,必须重新考虑他们在技术和以人为本的元素之间的投资平衡。 以人为本的网络安全方法对于减少安全故障至关重要。 在控制设计和实施以及通过业务沟通和网络安全人才管理中关注人&#xff…

Python中的异常——概述和基本语法

Python中的异常——概述和基本语法 摘要:Python中的异常是指在程序运行时发生的错误情况,包括但不限于除数为0、访问未定义变量、数据类型错误等。异常处理机制是Python提供的一种解决这些错误的方法,我们可以使用try/except语句来捕获异常并…

基于linux:MySql-5.7二进制安装部署

基于linux:MySql-5.7二进制安装 1)检查当前系统是否安装过Mysql [ ~]$ rpm -qa|grep mariadb mariadb-libs-5.5.56-2.el7.x86_64 //如果存在通过如下命令卸载 [ ~]$ sudo rpm -e --nodeps mariadb-libs //用此命令卸载mariadb2)解压MySQ…

限流算法浅析

前言 在前文接口请求安全措施中,简单提到过接口限流,那里是通过Guava工具类的RateLimiter实现的,它实际上是令牌桶限流的具体实现,那么下面分别介绍几种限流算法,做一个更详细的了解。 固定窗口限流 1、核心思想 在…

基于 Flink CDC 的现代数据栈实践

摘要:本文整理自阿里云技术专家,Apache Flink PMC Member & Committer, Flink CDC Maintainer 徐榜江和阿里云高级研发工程师,Apache Flink Contributor & Flink CDC Maintainer 阮航,在 Flink Forward Asia 2022 数据集成…

初识C语言————4

文章目录 常见关键字 1、 关键字 typedef 2、关键字static define 定义常量和宏 指针 结构体 前言 这是博主初识C语言系列的最后一篇,之后博主会更新更详细的关于C语言学习的知识。希望各位老铁多多支持。 一、常见关键字 1、 关键字 typedef typedef 顾名思义是…

海康威视发布2022年ESG报告:科技为善, 助力可持续的美好未来

近日,海康威视正式发布《2022环境、社会及管治报告》(以下简称“海康威视ESG报告”),连续5年呈现在环境、社会发展、企业治理等领域的思考和创新成果。此外,报告中首次披露了碳中和业务蓝图,积极布局绿色生产、绿色运营…

HTTP特性

1 HTTP/1.1 的优点有哪些? 2 HTTP/1.1 的缺点有哪些? 3 HTTP/1.1 的性能如何? HTTP 协议是基于 TCP/IP,并且使用了「请求 - 应答」的通信模式,所以性能的关键就在这两点里。 3.1 长连接 早期 HTTP/1.0 性能上的一…

分布式Id生成之雪花算法(SnowFlake)

目录 前言 回顾二进制 二进制概念 运算法则 位(Bit) 字节(Byte) 字符 字符集 二进制原码、反码、补码 有符号数和无符号数 疑问:为什么不是-127 ~ 127 ? 为什么需要分布式全局唯一ID…

sql中 join 的简单用法总结(带例子)

join 常见的用法有: 目录 left join(left outer join)right join(right outer join)join(inner join)full join(full outer join 、outer join)cross join 说明&#xf…