引用:
系统设计入门
通过分类特性设计 Amazon 的销售排名
第一步:通过讨论,明确限制及用例,确定Scope
支持的用例:
- 系统计算最近一周来,每个分类里最热门的商品
- 用户可以看到最近一周来,每个分类里最热门的商品
- 系统高可用 high availability
不支持的用例:
- 不涉及整个电商系统的其他部分
Constraints and assumptions:
- 访问不均匀
- 商品可能属于多个分类
- 没有子分类
- 结果要每小时计算更新一次
- 10 million 个商品
- 1000 个分类
- 每月 1 billion 笔交易,每秒400笔
计算规模:
每笔交易:
- created_at:5 bytes
- product_id:8 bytes
- category_id:4 bytes
- seller_id:8 bytes
- buyer_id:8 bytes
- quantity:4 bytes
- total_price:5 bytes
- 总共: ~40 bytes
每月:40 bytes * 1 billion = 40G
第二步:高层次设计
通过分类特性设计 Amazon 的销售排名第三步:设计核心组件
加入交易信息遵从一下的格式,存储在 Object Store 中
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
t2 product1 category2 1 10.00 2 3
t3 product2 category1 3 7.00 3 4
t4 product3 category2 7 2.00 4 5
t5 product4 category1 1 5.00 5 6
...
Service Rank Service 的主要工作:
- 从 Object Store 中读取交易信息,通过 MapReduce 计算每个分类中每个商品的销量,并根据销量进行排序。
- 将结果存储到数据表
sales_rank
中
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)
提供一个REST 形式的 Read API 供用户查看:
- 查询数据表
sales_rank
并返回。
第四步:扩展设计
通过分类特性设计 Amazon 的销售排名- 为了服务不同区域的用户,加快访问的速度,使用CDN加速,并缓存商品内容。
- 为了同时响应更多请求,对服务器水平扩展,并使用Load Balancer做负载均衡。
- 存储分析结果的数据 SQL Analytics 可以使用数据仓库,例如Amazon Redshift 或者 Google BigQuery.
- BigQuery 是 Google 推出的可扩展性强、成本低廉的无服务器企业数据仓库,可让您的所有数据分析人员更加高效地工作。不到一分钟便可设置好您的数据仓库并立即开始查询您的数据。Google BigQuery 可对 GB 级到 PB 级的数据执行极快速的 SQL 查询,并可轻松地将公共数据集或商业数据集与您的数据融合在一起。
- 为了加快读取效率,使用Memory Cache。
- 由于是读多写少,可以采用主从复制的数据库模式。主库同时负责读取和写入操作,并复制写入到一个或多个从库中,从库只负责读操作。
网友评论