本文档描述了销售排名系统,该系统根据销售数据计算并提供按类别的产品受欢迎度排名。该系统处理交易日志,以确定在特定时间段内(通常是过去一周)每个类别中最受欢迎的产品,并通过 REST API 提供这些排名。
销售排名系统解决了根据交易数据计算按类别销售排名的特定需求。它不涵盖通用的电子商务平台功能,而是专注于处理销售数据、计算排名并将其提供给用户的流程。
销售排名系统会监控各个类别的产品购买情况,定期处理这些数据,并维护每个类别中最受欢迎产品的更新列表。然后,这些数据通过读取 API 提供,以支持各种客户需求。
来源: solutions/system_design/sales_rank/README.md70-74
销售排名系统支持两个主要用例
该系统在设计时将高可用性作为一项关键要求。
来源: 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 作业
来源: solutions/system_design/sales_rank/README.md100-185 solutions/system_design/sales_rank/sales_rank_mapreduce.py6-72
销售 API 服务器处理产品购买并生成记录以下内容的交易日志:
来源: 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
销售排名结果存储在具有以下结构的 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)
表包含 id、category_id 和 product_id 上的索引,以优化查找性能。
来源: solutions/system_design/sales_rank/README.md187-199
读取 API 通过 RESTful 接口提供对销售排名数据的访问。示例请求
GET https://amazon.com/api/v1/popular?category_id=1234
示例响应
来源: solutions/system_design/sales_rank/README.md206-236
平均每秒有 40,000 次读取请求(高峰期可能更高),系统采用了多种策略:
来源: solutions/system_design/sales_rank/README.md271-272
该系统处理大约每秒 400 次写入(高峰期更高),使用:
来源: solutions/system_design/sales_rank/README.md273-282
该系统采用分层的数据存储方法。
每月新增交易内容约 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 数据库进行结构化存储以及多层架构来提供请求,展示了一种处理大量交易数据以计算产品受欢迎度排名的有效方法。该系统能够处理大型电子商务平台所需的高读/写负载,同时保持当前和准确的排名。