菜单

销售排名

相关源文件

本文档描述了销售排名系统,该系统根据销售数据计算并提供按类别的产品受欢迎度排名。该系统处理交易日志,以确定在特定时间段内(通常是过去一周)每个类别中最受欢迎的产品,并通过 REST API 提供这些排名。

目的与范围

销售排名系统解决了根据交易数据计算按类别销售排名的特定需求。它不涵盖通用的电子商务平台功能,而是专注于处理销售数据、计算排名并将其提供给用户的流程。

系统概览

销售排名系统会监控各个类别的产品购买情况,定期处理这些数据,并维护每个类别中最受欢迎产品的更新列表。然后,这些数据通过读取 API 提供,以支持各种客户需求。

来源: solutions/system_design/sales_rank/README.md70-74

用例

销售排名系统支持两个主要用例

  1. 服务计算:系统计算上周各类别最受欢迎的产品。
  2. 用户视图:用户可以按类别查看上周最受欢迎的产品。

该系统在设计时将高可用性作为一项关键要求。

来源: solutions/system_design/sales_rank/README.md15-19

系统约束

系统在以下约束下运行:

约束
产品1000万
类别1,000
事务每月10亿
读取请求每月1000亿
读写比例100:1
更新频率每小时
流量分布不均匀

此外

  • 物品可以属于多个类别
  • 物品不能更改类别
  • 不存在子类别
  • 更受欢迎的产品可能需要更频繁的更新

来源: solutions/system_design/sales_rank/README.md30-40

系统架构

销售排名系统由多个组件协同工作,以处理销售数据并提供排名。

来源: solutions/system_design/sales_rank/README.md242

数据处理流程

交易日志格式

系统处理具有以下格式的制表符分隔的日志条目

timestamp   product_id  category_id    qty     total_price   seller_id    buyer_id
t1          product1    category1      2       20.00         1            1
t2          product1    category2      2       20.00         2            2
...

来源: solutions/system_design/sales_rank/README.md85-96

MapReduce 过程

销售排名计算使用多步 MapReduce 过程。

MapReduce 作业

  1. 过滤过去一周的日志条目。
  2. 将它们映射到 (类别, 产品) 键,值为数量。
  3. 通过对每个键的数量求和来进行 Reduce。
  4. 通过创建允许正确分布式排序的新键来对结果进行排序。
  5. 生成最终排序列表以插入数据库。

来源: solutions/system_design/sales_rank/README.md100-185 solutions/system_design/sales_rank/sales_rank_mapreduce.py6-72

核心组件

销售 API 服务器

销售 API 服务器处理产品购买并生成记录以下内容的交易日志:

  • 时间戳
  • 产品 ID
  • 类别 ID
  • 数量
  • 价格
  • 卖家 ID
  • 买家 ID

来源: solutions/system_design/sales_rank/README.md85-96

对象存储

该系统使用托管对象存储(如 Amazon S3)来存储原始销售日志文件。此方法避免了管理分布式文件系统的复杂性。

来源: solutions/system_design/sales_rank/README.md81-82

销售排名服务

销售排名服务是处理 MapReduce 数据的主要组件。该实现有几个关键方法:

  • within_past_week():过滤交易,只包含过去一周的交易。
  • mapper():处理日志行并输出 (类别, product_id) 键,值为数量。
  • reducer():对每个键的数量进行求和。
  • mapper_sort():转换数据以通过重构键来启用正确排序。
  • reducer_identity():传递排序后的数据。
  • steps():组织 MapReduce 工作流程。

来源: solutions/system_design/sales_rank/README.md100-176 solutions/system_design/sales_rank/sales_rank_mapreduce.py6-72

数据库 Schema

销售排名结果存储在具有以下结构的 SQL 数据库表中。

sales_rank table:
id int NOT NULL AUTO_INCREMENT
category_id int NOT NULL
total_sold int NOT NULL
product_id int NOT NULL
PRIMARY KEY(id)
FOREIGN KEY(category_id) REFERENCES Categories(id)
FOREIGN KEY(product_id) REFERENCES Products(id)

表包含 idcategory_idproduct_id 上的索引,以优化查找性能。

来源: solutions/system_design/sales_rank/README.md187-199

读取 API

读取 API 通过 RESTful 接口提供对销售排名数据的访问。示例请求

GET https://amazon.com/api/v1/popular?category_id=1234

示例响应

来源: solutions/system_design/sales_rank/README.md206-236

扩展性考量

读取流量处理

平均每秒有 40,000 次读取请求(高峰期可能更高),系统采用了多种策略:

  • 内存缓存:存储热门内容排名以减少数据库负载。
  • SQL 读取副本:将读取查询分布到多个数据库实例。
  • 内容分发网络 (CDN):将静态响应缓存到离用户更近的位置。
  • 水平扩展:根据需要添加更多 Web 和 API 服务器。

来源: solutions/system_design/sales_rank/README.md271-272

写流量处理

该系统处理大约每秒 400 次写入(高峰期更高),使用:

  • SQL 主从复制配置。
  • 潜在的额外扩展技术,包括:
    • 联邦:按功能划分数据库。
    • 分片:根据分片键将数据分布到多个数据库。
    • 反规范化:添加冗余数据以避免昂贵的连接。
    • SQL 调优:优化查询和索引。

来源: solutions/system_design/sales_rank/README.md273-282

数据存储

该系统采用分层的数据存储方法。

  • SQL 数据库中的近期数据:用于活动查询。
  • 分析数据库中的历史数据:用于趋势分析(使用 Amazon Redshift 或 Google BigQuery 等数据仓库解决方案)。
  • 对象存储中的原始日志数据:用于长期存储和潜在的重新处理。

每月新增交易内容约 40 GB(3 年约 1.44 TB),对象存储可以轻松处理此数据量。

来源: solutions/system_design/sales_rank/README.md267-270

高级特性

销售排名系统可以通过其他功能进行扩展:

  • 对非常受欢迎的产品进行实时更新。
  • 基于用户偏好的个性化排名。
  • 趋势产品(销售速度,而不仅仅是总销量)。
  • 地区销售排名。
  • 基于时间的比较(周环比,月环比)。

实现示例

这是一个驱动销售排名计算的 MapReduce 实现的简化示例。

来源: solutions/system_design/sales_rank/sales_rank_mapreduce.py6-65

结论

销售排名系统通过利用 MapReduce 进行分布式处理、SQL 数据库进行结构化存储以及多层架构来提供请求,展示了一种处理大量交易数据以计算产品受欢迎度排名的有效方法。该系统能够处理大型电子商务平台所需的高读/写负载,同时保持当前和准确的排名。