度小满--笔试系统设计题

两道系统设计题:

1. API rate Limiting

系统有模块A、B、C、D各模块的处理能力不同,A模块只能支撑100QPS,B能支撑200QPS,C能支撑300QPS,D能支撑400QPS。

设计一个通用限流模块支持A、B、C、D的并发能力。

2. 短链服务

微博或者短信都有单条发送字数的限制,如果需要分享一个长网址,很容易越出限制,短链服务可以将长网址变成短网址,方便传播。

请设计一个短链服务,要求短网址尽可能短,且保证系统安全和并发能力。

这种系统设计题第一次很认真的写了,之前遇到类似的系统设计题是在CVTE,那个时候没什么思路,但今天我感觉写的也不一定好,我从接口的参数、返回值、逻辑,以及使用的技术栈进行考虑。

第一题我的思路:

  1. 参考Java中线程池的思想,我在接口参数中,允许开发者传入最大QPS,公平策略,拒绝策略,队列

  2. 使用Redis、MySQL、Quartz以及Zookeeper作为技术栈

  3. 具体的使用逻辑:因为计算QPS需要根据访问量以及时间快速计算,所以使用Redis

  4. 模块的QPS以及一些日志需要使用MySQL持久化到硬盘中,方便复盘

  5. Quartz跟Zookeeper用来做分布式定时任务的,定时将Redis的数据存入到MySQL中

  6. 当QPS达到最大允许QPS时,启动公平策略、拒绝策略即限流

第二题,

没有思路。。。。随便写了写

#笔试题目##度小满#
全部评论
第一题主要是访问量在某个时间节点突然增大,避免服务的瘫痪,时时查询QPS并计算是否达到上限确实是可行的,但是有一个问题,定时任务怎么防止突然某个时间的增大,如果查询时间间隔太短,那么频繁的查询计算QPS计算是否会占用较大内存,浪费性能,而间隔时间太长,又没办法避免突然的访问量增大。 我查了些资料,有些想法,就是对不同模块的访问使用令牌桶,令牌桶本身就把访问量控制住,不去查询QPS,而是令牌桶的令牌分发完了启用拒绝策略,每次都去令牌桶里拿令牌访问请求才能通过,而令牌桶按照一定速率往里面添加令牌,因为桶里的令牌数量是限制固定的,所以突然时刻的访问量增大,不用去查询QPS,而是因为拿不到令牌而被拒绝。
点赞 回复
分享
发布于 2021-04-11 22:53
有收到面试吗
点赞 回复
分享
发布于 2021-04-13 15:46
联想
校招火热招聘中
官网直投

相关推荐

从开始到反问1.项目经验可以介绍下吗? 2.解决了什么问题?3.这个系统怎么实现的?4.你可以讲一下这个系统实现目标 组成部分 各个组成部分之间是怎么交互的?5.用户系统 中台系统 网关系统是吧?用户系统是来干嘛的?你们服务的用户群体是?你们中台是怎么实现的?长链怎么变短链的?uuid是你这边生成的,为什么要加这个uuid呢?6.网关这里是什么功能?7.中台是怎么实现短链映射到长链的? mysql吗? 访问性能问题呢?缓存怎么设计的?什么时候加缓存的?把数据访问过后 数据加载到缓存 数据库里的数据如果更新了 你这个缓存会更新吗?你这里是访问之后更新缓存还是写数据之后更新缓存? 你们这个数据库 里有多少量 放在缓存里有多大?8.缓存用的redis?数据结构用的是? 创建的QPS是? 访问的QPS是?  这里创建的QPS我压测乱说的2000多 他问用了多少台机器?有做了什么优化吗?9.整体系统对外部设计的时候有没有目标 要支撑多少吞吐量?10.他问我在线上作为商业产品使用了是吧?我回答是11.我看你这边也提到了缓存穿透 请你讲一下。12.使用读写锁,什么情况用到的读写锁?你这边是怎么实现的呢?比如说是在创建的时候 ,什么地方加锁,什么地方解锁的。你这个读写锁是和你的用户深入绑定了?上锁和不上锁有什么区别吗?我这里说加读写锁 读的时候,就不能写,写的话会报该短链接正在被访问,然后他说我读你写,这个场景是允许的 你读你的,我写我的,最后你读了我也写了,然后一直强调问我加锁和不加锁这里的区别是什么?就他可不可以不加锁?那这里为什么要加锁?(你们这里做方案会有什么技术评审吗 会有吗?) 我回答:嗯。(没实习过。。。)13.幂等怎么实现的?为什么setnx能实现?redis是怎么保证原子性的?14.系统在哪里用到了消息队列?短链接监控为什么要用消息队列?方案选型上有考虑过吗?除了消息队列没考虑过其他吗?没有对比过多线程这些方案吗?15.你这边还用到了分库分表吗?哪个场景用的?你库表怎么设计的?你这个业务场景是根据哪个字段分的?16.gid是什么业务含义啊?这个分组id是用户选的还是什么?17.为什么是16个?那后面这个16会变吗?你这个分组是用户自己选的吗?会不会造成分布不均匀?
点赞 评论 收藏
转发
4 11 评论
分享
牛客网
牛客企业服务