场景题:排行榜怎么设计?

刷到此贴的友友春招/暑期必上岸!!!

鼠鼠在秋招的过程中多次被问到场景题,中大厂的考察频率相当之高,一般会放在最后一个问题用来拖时间,也遇到过上来就问你怎么设计一个系统(面试官以此来决定后面对你的态度)。所以鼠鼠准备开这个场景题栏目,分享在秋招过程中遇到的场景题以及如何进行回答,感兴趣和感觉有帮助的友友点个关注和赞吧,你们的点赞和关注是鼠鼠持续更新下去的最大动力!!!

话不多说开启今天的主题,排行榜设计吧!!!

排行榜是很常见的一个功能,在社交软件、游戏等各种场景中都有应用,积分、点赞、礼物、战绩排名等各类排行榜功能,这些排行本质都是基于计数进行排序的。不同的场景会有细微的设计差异,这里只讲通用的排行榜系统该如何设计,遇到具体的场景再做细微的调整即可,就算在面试过程中只能答出本文所设计的通用排行榜,也足够了,毕竟对于应届生也只会考察到这个程度,面试是尽可能多的回答问题,很难追求所有问题都能回答出来……

大家可能看过一些八股文,会回答直接使用zset进行试试排行即可。

鼠鼠也曾在面试中这样回答过:将每个用户的得分作为zset中元素的score,将用户ID作为元素的value。使用zset提供的排序功能,可以按照分数从高到低排序。

当时面试官说如果分数相同,按照默认的排序规则会按照value值排序,他希望按照时间顺序排序,也就是分数相同的情况下先上榜的排在前面。

当时把鼠鼠给难住了,面完后才找到一个可行的方案:

为了实现分数相同按照时间顺序排序,可以将分数score设置为一个浮点数,其中整数部分为得分,小数部分为时间戳

即:score = 分数 + 1 - 时间戳/1e13

此时在分数相同的情况下,时间早的时间戳小,除以一个很大的数后得到的数字就小,被1减去以后得到的差就会大,也就实现了

分数相同的情况下先上榜的排在前面。

但面试官后面希望我聊一些系统设计的思路,当时鼠鼠完全没有系统设计的思路,不管后面复盘后也总结出了一套方法论,在这里分享给大家。

(1)明晰项目诉求:在这里就是设计出一个根据积分或点赞等数据进行排序。同时关注请求量,是否需要做高并发/高可用的扩展设计;此外对实时性是否也要要求,追求强一致性还是最终一致性

(2)确定业务逻辑:新用户上榜后排行榜要产生变化;用户积分发生变化后调整排名

(3)架构设计:存储(MySQL/Redis)+服务(是否需要拆分为多个服务)

大体上排行榜由两部分组成,排序结构和信息汇总结构。也就是我们在排行榜上看到的根据点赞数排出前一百,而信息汇总则是我们点击某一个用户头像可以看到其具体的用户信息。 系统设计初期,前端同步调用排行榜系统,对于并发量不大的情况,可以直接使用MySQL作为存储,直接操作数据库io即可,这里数据库的极限在5000/s。也可以先把全量数据从数据库里取出来后在内存中进行排序(前提是数据量不大的情况下)

但随着并发量和用户量上升,这种强依赖的同步调用会增加接口延迟。 这时可以增加中间层,也就是应对接口性能提不上去的三板斧之一(缓存,消息队列,分库分表)。如使用Rocket MQ或Kafka等消息队列(MQ)。流量大时可对排行榜系统起到削峰作用,还可批量插入数据库减少IO次数,提高插入效率。不过,使用MQ后要做好幂等处理(八股提问,MQ的消息幂等有哪些方式可以实现)。 当流量和并发量持续上升,数据库读写锁竞争加剧,可采用主从分离等方式均摊读压力,当然也可以直接考虑使用Redis作为排行榜。利用Redis的sortset类型排序(这里需要掌握zset,相关的八股文也要熟悉,可能会被问到),如排行评论数可使用ZINCRBY命令更新,查询用ZREVRANGE命令获取前N名排名和分数。 架构上可以由Redis作为消费者,它订阅MQ消息,消费时做幂等判断,用Lua脚本保证操作原子性。(这段话可以作为经典话术使用)

总结:

针对排行榜,简单的就直接可以使用Redis排序,但如果需要保证时间戳小的在前面就需要做一点小处理。

面对设计一个通用的排行榜系统,考察系统设计能力,这里就可以从我前面列举的方法论进行展开,多多关注我的文章,积累经验,相信友友们一定会越来越游刃有余。

PS:

其实在整个分析过程中大家可以发现,场景题其实就会把我们背的那些八股和技术运用起来,所以在学习场景题的时候就可以把八股文进行问题,有点像单词背不住就去读阅读文章,在读文章的时候记住八股文,在上面的分析过程中我也有几处进行了随机的八股提问。排行榜这个过程系统设计过程中有用到MQ,那友友们是不是可以顺带复习一下MQ的相关八股呢?

(1)如何保证MQ的消息幂等性?

(2)MQ的推模式和拉模式是什么?

(3)如何保证MQ消息不丢?

……

以上都是鼠鼠在面试中只要遇到Redis就一定会被问到的,不一定是全部问到,但至少都是三选一了…

好了如果大家有什么问题的话欢迎来评论区交流。包括但不限于文章创作改正意见,后续分享内容(面经,知识输出,经验分享等等),都看到这了,点个免费的关注和赞不过分吧

#场景题##八股文##面试##暑期实习##春招#
全部评论
时间戳处理很妙
5 回复 分享
发布于 03-27 20:46 湖北
1e13 这个是怎么确定的
1 回复 分享
发布于 03-31 13:13 江西
1 回复 分享
发布于 03-27 22:34 北京
m
点赞 回复 分享
发布于 04-30 12:54 四川
m
点赞 回复 分享
发布于 04-21 09:56 四川
催更催更催更
点赞 回复 分享
发布于 04-15 15:21 陕西
点赞 回复 分享
发布于 04-04 16:05 福建
优秀
点赞 回复 分享
发布于 04-03 13:02 广东
排行榜用 mq 没太看明白,可以解释一下吗
点赞 回复 分享
发布于 04-01 16:55 广东
点赞 回复 分享
发布于 04-01 16:17 上海
mark
点赞 回复 分享
发布于 04-01 06:19 上海
点赞 回复 分享
发布于 03-31 12:56 浙江
mark住Redis部分
点赞 回复 分享
发布于 03-31 09:18 湖北

相关推荐

06-20 16:49
已编辑
字节跳动_llm开发(实习员工)
大家很多人私信我大模型应用开发具体是做啥,正好我讲讲在字节实习3个月+的体验。现在以字节为例我看很多岗位,其实大模型应用岗位已经被纳入后端开发(大多还是属于开发序列,至少我看不在算法序列)当中了,所以总的来说二者并没有特别明显的区别,起码在公司的角度来看。以我自己为例,我也是面的后端岗位然后进来做Agent的开发,Agent开发暂时不涉及模型的训练,最多包含一些模型的微调(而且公司有平台)。总的来说,Agent开发主要是搭建workflow,主要涉及Rag、微调、Mcp、Prompt这些方面,包含一些技术栈py:langgraph、langchain、langSmith,java: SpringAI、langchain4j?,所以我觉得后端的同学直接投问题不大,但是需要python or java or 大模型基本知识的landing。我之前也没接触过类似的知识,还在字节里面有LLM学习季的好东西,包含了大模型的基本知识Transformer、Prompt工程、Rag实战等等各种基本知识的解释和实操,让我非常循序并循序渐进的了解了这方面的知识,并且燃起了对大模型学习的兴趣,不得不说这一点还是很值得学习的。其次,就是在实习过程中,大家讨论的都是如何提高大模型产生的效果、以及有没有更加方便的Agent工具能够参与 or 使用提效,整体氛围很不错,而且都是去聊一些比较新的东西,例如之前刚出的Agent2Agent协议。在我看来,Agent主要是以Multi-Agent写作文的形式完成一系列任务,例如Deep-Research利用搜索、爬虫等工具,获取想要查询的网页并爬取文章内容,并且生成一篇分析报告,包括了一些意图识别、任务规划、记忆、工具调用等。在这个过程可以加很多环节去提高分析报告的效果(在Prompt的层面),例如反思、自问自答、知识库、human-in-loop等等,我觉得设计这些环节还是需要很多经验的,目前很多需要参考了类似的设计有比如cursor等。至于学历的要求,不知道现在岗位需不需要硕士的学历,但是我看来其实本科也能做,包括我在的组很多Agent内容在Cursor、Trae等工具的辅助下,前端也参与了不少(没错,前端也写Agent)。所以现在在各种Agent工具不断出现的今天,大厂更加需要“能够熟练使用AI工具的人”。举例,本组有个本科校招生,ld说后续会让他参与LLM的开发内容。当然,以上是我3个月浅薄的理解,我其实也看了不少内容的一些技术文章,整体来说大概是个这么情况,感觉技术壁垒不深,但是基于目前资料跟Java(黑马)比有所欠缺的情况下,还是筛掉了相当一部分人,感觉可冲(感觉比较缺人,至少我们组人很缺);但是基于我之前很多段实习都是Java开发,我觉得大模型应用更在乎大模型的效果而不是性能,可能还是关注点会跟Java开发有一些区别,优先级不一样,很少用到一些中间件来做啥,目前我在整个过程中只用过Redis来缓存stream流。实习体验:1.需求:字节跟我实习过的其他大厂有很明显的区别,他是直接安排活让你去做,至于你做不做得了,这个就另说了(即使有mentor的帮助)。有个群友举的例子很好“就是把一个不会游泳的初学者丢进水池里,如果活下来了,就学会了哈哈”。所以在我很久没写py、langchain等内容的基础上、没在字节做过任何需求的时候,让我开发了一个我认为很大的一个需求,大概6-7000行(两周),我为了不延期,主动加班到10-11点,才在排期前做完。。2.福利:经历了字节下午茶的LastDay目前已经没啥福利了,零食、水果还是不错;其次,允许实习生出差,刚来没几天就团建 + 出差去北京(出差了一周),那段时间还是很滋润的,在北京也小小旅游了一下(带着女朋友一起去了,当然她的不报销,只是住在一起)3.博客:当初在快手实习的时候,基本上看遍了Kstack的文章,但是在字节我目前还没看完,而且受益匪浅,感觉文章整体含金量要高不少(可能快手现在也变好了,不尬黑)。4.带教:mentor和ld对我很好,也让我进入了一个新的领域,目前正好考虑通过这次机会往大模型应用甚至大模型算法转型.正好有学长跟我说过,“阿里很值得去实习体验一次,哪怕不留下来”,我觉得“字节也很值得去体验一次,哪怕不留下来”,之前在前几家公司反而没这么深刻的感悟。如果对各位有帮助的话,求求🥺给朵小红花,有问题可以在评论区交流~
错开的雪季:mark感谢分享
投递字节跳动等公司8个岗位
点赞 评论 收藏
分享
评论
77
319
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务