电子商务网站设计(第一部分)

今天我们讨论电子商务网站。不仅在很多系统设计面试中都询问了这个话题,而且电子商务网站今天如此流行,以至于为此开发了许多技术和研究。

在深入探讨此主题之前,最好先了解为什么设计电子商务网站在系统设计面试中很受欢迎。首先,建立一个电子商务网站需要诸如数据库设计,系统可用性,并发考虑之类的东西。所有这些在当今的分布式系统中都极为重要。此外,每个人都使用过一些电子商务网站,例如亚马逊。如果您通常对周围环境感到好奇,则应该已经考虑过该主题。

macbook692573_640.jpg

电子商务模式

在我们的指南8系统设计面试之前您需要知道的事情中,我们说过系统设计面试的常见策略是从简单的基础知识开始,而不是直接跳入细节。那么,您将如何设计电子商务网站的基本数据结构?那数据库模式呢?

我将跳过用户模型的数据结构,因为它应该与其他应用程序非常相似。让我们专注于产品。在最简单的情况下,我们需要三个主要对象:ProductUser_和_Order

_产品_定义购物车中_产品_的基本模型。一些重要的字段包括价格,剩余数量,名称,描述和类别。类别在这里可能很棘手。当然,您可以在SQL数据库中将其设置为字符串字段,但是更好的方法是使用包含类别ID,名称以及其他信息的_类别_表。因此,每个产品都可以保留一个类别ID。

_订单_存储有关用户所有订单的信息。因此,每一行都包含产品ID,用户ID,数量,时间戳,状态等。因此,当用户继续进行结帐时,我们将汇总与该用户关联的所有条目以显示在购物车中(当然,我们应该过滤掉过去购买的商品)。

电子商务中的NoSQL

在上面的分析中,我们使用的是关系数据库,例如MySQL。实际上,NoSQL数据库有时可能是电子商务网站的更好选择。

万一很多人不了解NoSQL,用外行的术语来说,NoSQL数据库尝试将一堆东西存储在一行中而不是多个表中。例如,除了拥有一个单独的_Order_表之外,我们还可以将用户购买的所有商品存储在_User_ table 的同一行中_。_结果,在获取用户时,我们不仅会获得所有个人信息,而且还会获得其购买历史记录。

在这种情况下,为什么NoSQL会更好(略)?让我们以_产品_模型为例。假设我们正在卖书。产品具有类别书和大量的属性,如作者,发布日期,版本,页数等,并且此SQL表可能包含20列。没关系。

现在,我们也想出售笔记本电脑。因此,产品还应该存储笔记本电脑的属性,包括品牌名称,尺寸,颜色等。如您所想,引入了更多类别后,“ _产品”_表中可能有许多列。如果每个类别平均有10个属性,那么它将是100列,仅支持10个类别!

但是,对于像MongoDB这样的NoSQL数据库,一个很大的优点是它支持这样的大量“列”。每行可以有大量列,但并非所有列都已设置。这就像将JSON对象存储为一行一样(实际上,MongoDB使用的是非常相似的BSON)。结果,我们可以将产品的所有这些属性(列)存储在一行中,这正是NoSQL数据库所擅长的。

movie918655_640.jpg

并发

让我们继续讨论扩展问题。将电子商务网站扩展到多台计算机时,会出现很多问题。最重要的是,电子商务网站对大多数此类问题的容忍度几乎为零。

以并发为例。假设商店里只剩下一本书,两个人同时购买。如果没有任何并发​​机制,那么两个人都有可能成功购买它。您如何在电子商务网站中实现并发?

让我们逐步分析这一点。从我们从OS类中学到的知识中,我们知道锁是保护公共资源的最常用技术。假设用户A和B都想购买同一本书。我们可以做的是,当A拿到有关这本书的数据时,在这一行上加一个锁,这样其他人都无法访问它。一旦A完成购买(减少剩余的金额),我们就释放锁,以便B可以访问数据。相同的方法应该适用于所有资源,这可以完全解决问题。

上述解决方案称为悲观并发控制。尽管它可以防止由并发引起的所有冲突,但缺点是成本很高。显然,对于每次数据访问,我们都需要创建和释放一个锁,这在大多数时候可能是不必要的。

我们可以不加锁地解决问题吗?

摘要

在下一篇文章中,我们将讨论一种更好的并发问题解决方案,而无需使用锁。关于电子商务网站,我想讲的话题太多。

实际上,许多技术在所有分布式系统中都是通用的,重要的是比较每种方法的利弊,并选择最适合特定应用的方法。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×