设计练习 - Movie Review Aggregator System
题目
我们要求设计一个电影评价处理系统。我们拥有一个网站可以收集用户对于电影的评价。然后我们需要做的是在网站上对于每部电影呈现评价。我们也允许其他用户对于电影评价进行评级,即表示为赞同和反对。另外我们还需要一个data pipeline对于电影评价进行后续处理,比如通过电影评价对于每部电影的影响力进行评估。
需求
功能需求
- 用户可以对某一部电影进行评价
- 用户可以对某一个电影的评价进行五星评价,即从一星到五星
- 用户的五星评价被平均,然后作为某一条评价的平均五星评价
- 对于电影的评价和五星评级可以被后台进一步处理以挖掘数据中的信息
非功能需求
- 对于电影的评价需要很快展示在网站上,latency应该少于500ms
- 对于平均的五星评价可以有10 分钟的延迟进行计算和展示
- 后台数据的处理对于latency不是很敏感,可以有一小时的延迟
- 整体系统要求高可靠性
- 整体系统要求高可扩展性(scalability)
架构设计
首先我们分析一下系统中所涉及到对象和它们之间的关系(OOD)。
解释一下图中各个对象:
- WebSite:网站
- Movie:某一部电影
- Comment:对某一部电影的评价
- CommentPipeline:对某一部电影的评价进行处理的数据pipeline
- Evaluation:对某一部电影的某一条评价的五星评级
- EvaluationPipeline:计算某一部电影的某一条评价的平均五星评级
- AggregatedEvaluation:平均五星评级
基于这个关系,我们可以使用aws来将其转化为系统架构:
我们对其中几个重要的功能模块的选择进行说明。
我们的网站需要读取电影,电影评价,和电影平均的五星评级。我们使用Lambda和java springboot来实现restful api以支持这些功能。
对于平均五星评价的计算我们可以使用EMR和EventBridge来定期使用HIVE或者Spark计算每个comment的平均五星评价。
我们还可以使用DataPipeline,SageMaker,和EventBridge来定期使用SageMaker处理数据,或者build ML模型。
API设计
我们基于restful设计如下的api:
- GET /movies?page=1&limit=10
- GET /comments/{movie_id}?page=1&limit=10
- POST /comments/{movie_id}
- GET /evaluation/{comment_id}?page=1&limit=10
- POST /evaluation/{comment_id}
对于读取movie,comment,和evaluation,我们每次只读取一个page。这样我们保证latency不会很高。
DB Schema设计
我们使用DDB来支持我们的数据存储和访问的需求。对所使用的表进行如下的schema设计:
MovieTable:
No. | Name | Notes |
1 | ID | primary key. String type. |
2 | Name | String type. |
Comment Table
No. | Name | Notes |
1 | MovieId | ParitionKey. String type. |
2 | CommentId | SortKey. String type. |
3 | Content | String type. |
EvaluationTable
No. | Name | Notes |
1 | EvaluationId | PartitionKey. String type. |
2 | CommentId | SortKey. String type. |
3 | Evaluation | Numeric type. The value is [1, 5]. |
AggregatedEvaluationTable
No. | Name | Notes |
1 | MovieId | PartitionKey. |
2 | CommentId | SortKey. |
3 | AverageEvaluation | Numeric value in [1,5] |
总结
本文是对比此篇文章所做。对比了一下原文,总体上方案是相似的。但是有以下几点可以改进:
- 对于一些非功能的需求,比如高可靠性,高可扩展性,这些功能虽然aws的服务已经涵盖,但是最好还是把背后的工作原理进行说明,而不仅仅因为aws已经涵盖了就一笔带过。
- 考虑到cache的使用。cache是optional的,但是作为一个提升performance的有效方法,应该被考虑到。
- 除了本文中所提到的一些基本设计功能,可以对应用层的逻辑进行描述,比如对于数据的normalization,对于处理第三方数据的技巧等。