当前位置: 首页 > ds >正文

设计练习 - Movie Review Aggregator System

题目

我们要求设计一个电影评价处理系统。我们拥有一个网站可以收集用户对于电影的评价。然后我们需要做的是在网站上对于每部电影呈现评价。我们也允许其他用户对于电影评价进行评级,即表示为赞同和反对。另外我们还需要一个data pipeline对于电影评价进行后续处理,比如通过电影评价对于每部电影的影响力进行评估。

需求

功能需求

  1. 用户可以对某一部电影进行评价
  2. 用户可以对某一个电影的评价进行五星评价,即从一星到五星
  3. 用户的五星评价被平均,然后作为某一条评价的平均五星评价
  4. 对于电影的评价和五星评级可以被后台进一步处理以挖掘数据中的信息

非功能需求

  1. 对于电影的评价需要很快展示在网站上,latency应该少于500ms
  2. 对于平均的五星评价可以有10 分钟的延迟进行计算和展示
  3. 后台数据的处理对于latency不是很敏感,可以有一小时的延迟
  4. 整体系统要求高可靠性
  5. 整体系统要求高可扩展性(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.NameNotes
1IDprimary key. String type.
2NameString type.

 Comment Table

No.NameNotes
1MovieIdParitionKey. String type.
2CommentIdSortKey. String type.
3ContentString type.

EvaluationTable

No.NameNotes
1EvaluationIdPartitionKey. String type.
2CommentIdSortKey. String type.
3EvaluationNumeric type. The value is [1, 5].

AggregatedEvaluationTable

No.NameNotes
1MovieIdPartitionKey.
2CommentIdSortKey.
3AverageEvaluationNumeric value in [1,5]

总结

本文是对比此篇文章所做。对比了一下原文,总体上方案是相似的。但是有以下几点可以改进:

  • 对于一些非功能的需求,比如高可靠性,高可扩展性,这些功能虽然aws的服务已经涵盖,但是最好还是把背后的工作原理进行说明,而不仅仅因为aws已经涵盖了就一笔带过。
  • 考虑到cache的使用。cache是optional的,但是作为一个提升performance的有效方法,应该被考虑到。
  • 除了本文中所提到的一些基本设计功能,可以对应用层的逻辑进行描述,比如对于数据的normalization,对于处理第三方数据的技巧等。
http://www.xdnf.cn/news/7030.html

相关文章:

  • 探秘Transformer系列之(33)--- DeepSeek MTP
  • 【爬虫】DrissionPage-6
  • MapReduce 原理深度剖析:从任务执行到参数配置
  • AI编码代理的崛起 - AlphaEvolve与Codex的对比分析引言
  • 61. 旋转链表
  • 理解 plank 自动生成的 copyWithBlock: 方法
  • C++(初阶)(十八)——AVL树
  • 深入解析:如何基于开源OpENer开发EtherNet/IP从站服务
  • 深入浅出IIC协议 - 从总线原理到FPGA实战开发 -- 第一篇:I2C总线协议深度解剖
  • 广和通L610模块通过AT指令访问服务器方案:嵌赛使用
  • 蓝桥杯-不完整的算式
  • select语句的书写顺序
  • DAY 23 训练
  • Vue框架
  • windows 10 做服务器 其他电脑无法访问,怎么回事?
  • 深度学习模型入门:从基础到前沿
  • leetcode 239. 滑动窗口最大值
  • MySQL初阶:sql事务和索引
  • 电子电路:什么是高频电路以及都有哪些应用?
  • 手机打电话时由对方DTMF响应切换多级IVR语音应答(二)
  • UDP的单播组播与广播
  • 使用 Python 打造一个强大的文件系统结构创建器
  • 前脚收购 Windsurf 后,OpenAI 深夜发布 Codex。
  • 基于Yolov8+PyQT的老人摔倒识别系统源码
  • 计算机视觉与深度学习 | Python实现EMD-CNN-LSTM时间序列预测(完整源码、数据、公式)
  • 基于CentOS7制作OpenSSL 1.1的RPM包
  • Webpack DefinePlugin插件介绍(允许在编译时创建JS全局常量,常量可以在源代码中直接使用)JS环境变量
  • HarmonyOS:重构万物互联时代的操作系统范式
  • 6.1.1图的基本概念
  • 在宝塔中使用.NET环境管理部署 .NET Core项目