上周我参加了一个面试,其中有一道系统设计题:某公司的内网有个质询系统。该公司的每个职员都可以对本公司的任何部门的任何事件提问题,并且所有的其他职员都能看到这些问题,还可以对问题打分,打分的范围是一颗星到五颗星。现在让我们来设计打分系统,不用考虑提问功能。

以下是面试官给出的基本的测试用例:
1.用户可以对任意一个问题评分,打分范围是一颗星到五颗星;
2.公司的分析部门需要一个查询api,这个api可以:
a.查询某条问题的平均分;
b.查询某个问题的top 10的高分以及用户名;
c.查看某个用户评过分的所有问题;

注意:
1.这个公司的职员有几十万之多,因此评分系统需要考虑性能问题。并且每天早上上班的时候是评分系统负载最大的时间点。
2.不需要考虑安全问题。
3.所有数据都需要长期保存,不用考虑删除问题。

以下是我的设计:
1.数据库的设计:
数据库有4个表,如下图。

comments表,用来记录问题,每条问题都有一个唯一的id;user表用来保存用户的信息,每个用户都有唯一的id。这两个表都是RMDB表,因为他们的数据相对来说比较固定,不会被频繁修改。

rating_comments表,用来记录用户对每个问题的评分。如果这个表使用RMDB的话,它与comments表和user表做join的成本会很高;而且这个表必然需要对用户id和问题id做索引以加速查询,又因为这个表的数据会被频繁的更新,所以维护索引的开销会很大。因此,这个表会使用基于key-value的NoSQL DB。key就是问题的id,value是一个队列,这个队列的每条记录包含两个字段,一个字段是uid,也就是用户id,另一个字段是分数,所以队列中的一条记录就是一个用户对某个问题的打分,这个队列按照分数高低排序,所以对于某个问题,我们可以很容易的找到它的最高分和最低分。

rating_user表,也用来记录用户对每个问题的评分。基于与rating_comments表同样的原因,这个表也使用基于key-value的NoSQL DB。不过,与rating_comments表的区别在于,这个表的key是用户id,队列的每条记录是由问题id和问题的分数组成的。很明显,这个表的数据相对于rating_comments表是冗余的。这个表的目的是加速对于某个用户打过分的问题的查询。

2.评分系统的架构如下图。分为4层,其中每一层都可以扩展为load balancer+多台服务器的模式。
层一:web server
层二:write api 和 search api
层三:memcache
层四:数据库,包含RMDB和NOSQL DB

3.业务流程:
1)用户可以对任意一个问题评分,打分范围是一颗星到五颗星;
a.用户向web server发请求

b.web server向write api发请求
c.write api根据用户id和问题id以及用户的评分更新rating_comments表和rating_user表

2)查询某条问题的平均分;
a.用户向web server发请求
b.web server向search api发请求
c.search api根据问题id来查询rating_comments表,返回一个用户打分队列,使用队列中的数据计算平均分并返回结果。

3)查询某个问题的top 10的高分以及用户名
a.用户向web server发请求
b.web server向search api发请求
c.search api根据问题id来查询rating_comments表,返回一个用户打分队列,使用队列中的已排序数据返回top 10的最高分以及对应的用户。

4)查看某个用户评过分的所有问题
a.用户向web server发请求
b.web server向search api发请求
c.search api根据用户id来查询rating_user表,返回一个打分队列,使用队列中的所有问题id就是用户打分过的问题。

4. write api:
write api server 提供以下接口:
bool save_score(int question_id, int user_id, int score)
question_id就是问题的id,user_id就是用户的id,score就是用户的打分。write api server提供这个接口给web server,用户用这个接口给问题打分。

5.其他:
1)对于平均分,其实可以再增加一个average_score表,包含两个字段:一个是问题id,另一个是平均分;每次用户调用write api打分的同时也更新这个平均分表。这个平均分表可以加速对平均分的查询。

2)面试官反复强调一个问题可能会被大量的用户打分,问我,我的设计是否合理?我觉得挺合理的,使用key-value nosql数据库存储问题以及打分队列,不会有性能问题。然后反复问我,我对这个设计是否满意?我觉得没啥大问题。后来时间不够,就没有深入讨论search api。

系统设计面试题之 怎么设计一个打分系统相关推荐

  1. 面试题:如何设计一个权限系统?

    点击上方"码农进阶之路",选择"设为星标" 回复"面经"获取面试资料 来源:cnblogs.com/iceblow/p/11121362.h ...

  2. Java面试,如何设计一个秒杀系统

    Java面试,如何设计一个秒杀系统说起秒杀,我想你肯定不陌生,从双十一购物到春节抢红包,再到逢年过节抢⻋票,"秒杀"的场景在我们的生活中处处可⻅.简单来说,秒杀就是在同一个时刻有大 ...

  3. 阿里最后一面,高并发下如何设计一个秒杀系统?

    近年来,随着"双十一"购物节和抖音等直播平台带货的热潮,大批促销活动涌现,「秒杀」这个词也越来越频繁地出现在我们的生活里. 除了那些头部的电商公司,某宝.某东,还有各种街.某说.某 ...

  4. 大厂最后一面,如何设计一个秒杀系统

    近年来,随着"双十一"购物节和抖音等直播平台带货的热潮,大批促销活动涌现,「秒杀」这个词也越来越频繁地出现在我们的生活里. 除了那些头部的电商公司,某宝.某东,还有各种街.某说.某 ...

  5. 如何设计一个支付系统?

    大家好,我是田哥 田哥之前待过支付公司,也待过P2P公司,所以对支付系统还是有那么一些认识.支付是一个非常大并且应用广泛的一个行业,它是万事万物的基础!我觉得任何产品的最后一公里肯定是支付了. 有人说 ...

  6. 从零开始设计一个IT系统

    从零开始设计一个IT系统是件让人头痛的事,让我们来看一个实际的例子:由Cunard Line耗资8亿美元造的Queen Mary 2号油轮上各种豪华设施一应俱全,最多能同时容纳2600位乘客.假设 & ...

  7. Java核心知识点 --- 线程中如何创建锁和使用锁 Lock , 设计一个缓存系统

    理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...

  8. 如何设计一个权限系统

    本文来说下如何设计一个权限系统 文章目录 概述 权限模型 RBAC0模型 RBAC1模型 RBAC2模型 RBAC3模型 用户组 组织 职位 含有组织/职位/用户组的模型 授权流程 表结构 权限框架 ...

  9. 极客时间-如何设计一个秒杀系统-笔记0到2章

    极客时间-如何设计一个秒杀系统-笔记0到2章 0.开篇词-系统秒杀系统架构设计都有哪些关键点? 1.设计秒杀系统时应该注意的5个架构原则 1.数据要尽量少 2.请求数要尽量少 3.路径要尽量少 4.依 ...

  10. 设计一个秒杀系统-秒杀方案分析

    学习使用,老鸟飞过,欢迎交流 秒杀系统应该考虑哪些因素 高可用:秒杀系统最大的特点就是并发高,在极短的时间内, 瞬间用户量大.试想一下双11的时候可能会有几十万的用户去访问同一个商品详情页面秒杀同一个 ...

最新文章

  1. [C] 层层递进——C语言实现广度优先搜索
  2. 学金融买计算机配置,我是学金融投资的计算机等级考试哪个方向对我工作有用...
  3. 文件传输:二进制文件传输与文本传输(file transfer)
  4. 【Android 逆向】Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | VS 自带的 Android 平台应用创建与配置 )
  5. Paper之IEEERSJ:2009年~2019年机器人技术(IEEE机器人和自动化国际会议RSJ智能机器人与系统国际会议机器人技术:科学与系统机器人学报)历年最佳论文简介及其解读
  6. C++ Primer 5th笔记(chap 19 特殊工具与技术)控制内存分配
  7. BOOST内存管理(一) --- boost::object_pool
  8. 说说MaxTenuringThreshold这个参数
  9. js代码格式化工具(简单格式化,显示进度条)
  10. I2C(smbus、pmbus)和 SPI协议
  11. 在MAC上安装mangodb
  12. 逆向之Smali入门学习
  13. PyWebIO 简单的Sanger截图应用
  14. SpringCloud Alibaba实战第九课 分布式事务理论、DevOps运维
  15. 关于hostapd 2.7版本的移植问题
  16. 关于线程池中Worker对象的理解
  17. Unity3D游戏开发入门学习笔记
  18. 阿里云服务器安装oracle11g——会用的到,建议收藏
  19. python中的self到底是什么
  20. 【爬虫小白】各种请求使用代理的方法

热门文章

  1. 苹果手机换电池对手机有影响吗_手机电池多久需要换一次?
  2. FDTD的PML设置
  3. [乐意黎转载]“多情自古空余恨”的下句是什么?
  4. 数字英文唯一_福特高光归来!双喷+同级唯一8AT,福克斯“猎装”大杀四方
  5. pick out.php,pick_out.php
  6. 腾讯Bugly的前世今生
  7. React官方文档教程学习
  8. 穷举php,[讨论]穷举攻击
  9. win10安装Hive3.0.0
  10. Java将文件转换成二维码