设计一个系统
在设计系统时,要使用到抽象思想、模块化思想。在分析系统、设计系统架构时,大多情况下都会遵循一个规律:
- 分析问题特点。可以从用户使用场景角度去分析,主要从流量大小、服务场景的运行时长、资源是否有限;
- 给出评判标准。可以从用例图的角度去分析,主要包括 C 端用户、平台、B 端用户;
- 提出解决方案。可以从项目部署视图的角度去分析,主要包括客户端、中间件、服务端;
包括软件设计中的相关概念 软件质量评估与保证、软件开发模式、软件过程控制、软件架构设计
系统设计类
手写 RPC 框架
- RPC 选型
- 阿里 Dubbo
- 新浪 Motan
- Facebook Thrift
- Google gRPC
- RPC 与 HTTPClient 区别
- 设计自己的 RPC 框架
- RPC 框架及原理
- 设计自己的 RPC 框架需要考虑的要点
- 注册中心
- 序列化与反序列化
- 负载均衡
- 网络传输
- 动态代理
- 传输协议
- 相关技术的选型
如何设计一个排行榜
- 使用 Mysql 的 order by 进行排序
- 使用 redis 的 zset 进行排序
如何设计秒杀系统
- 秒杀系统所具有的特点
- 技术角度
- 三高
- 数据强一致性
- 读多写少
- 业务角度
- 高风险
- 高利润
- 技术角度
- 秒杀系统所遇到的挑战
- 热点数据的存储
- 如何探测热点 key:
- 客户端收集上报:改动 Redis SDK,记录每个请求,定时把收集到的数据上报,然后由一个统一的服务进行聚合计算。方案直观简单,但没法适应多语言架构,一方面多语言 SDK 对齐是个问题,另外一方面后期 SDK 的维护升级会面临比较大的困难,成本很高。
- 代理层收集上报:如果所有的 Redis 请求都经过代理的话,可以考虑改动 Proxy 代码进行收集,思路与客户端基本类似。该方案对使用方完全透明,能够解决客户端 SDK 的语言异构和版本升级问题,不过开发成本会比客户端高些。
- Redis 数据定时扫描:Redis 在 4.0 版本之后添加了 hotkeys 查找特性,可以直接利用 redis-cli --hotkeys 获取当前 keyspace 的热点 key,实现上是通过 scan + object freq 完成的。该方案无需二次开发,能够直接利用现成的工具,但由于需要扫描整个 keyspace,实时性上比较差,另外扫描耗时与 key 的数量正相关,如果 key 的数量比较多,耗时可能会非常长。
- Redis 节点抓包解析:在可能存在热 key 的节点上(流量倾斜判断),通过 tcpdump 抓取一段时间内的流量并上报,然后由一个外部的程序进行解析、聚合和计算。该方案无需侵入现有的 SDK 或者 Proxy 中间件,开发维护成本可控,但也存在缺点的,具体是热 key 节点的网络流量和系统负载已经比较高了,抓包可能会情况进一步恶化。
- 如何处理热点 key: 本地缓存+分布式缓存
- 如何探测热点 key:
- 流量打散
- 前端如何做?
- CND
- 秒杀时添加 验证码 和 回答问题等
- 后端如何做?
- 负载均衡,如 nginx
- 限流器,如 hystrix 和 Sentinel、漏桶算法等
- 排队处理,如添加消息中间件等
- 前端如何做?
- 超卖,接口幂等性
- 分布式锁
- 同步锁
- 业务唯一性字段的校验等
- 预防黄牛和秒杀器
- 如何识别黄牛和秒杀器?
- 风险监控系统
- 服务隔离
- 熔断:针对服务外部及第三方服务的故障,防止服务调用者由于被调用者的不可用导致的级联故障,服务雪崩
- 降级:针对服务内部故障
- 数据强一致性
- 哪些地方不一致?(数据库和缓存、本地缓存与分布式缓存)
- 分布式事务(CAP/BASE 原理,分布式事务实现)
- 性能测试
- jmeter
- 服务监控与风险控制
- 日志搜索平台搭建及链路追踪
- 封控系统搭建
- 热点数据的存储
- 什么是秒杀系统
- 大量请求对有限资源的瞬时请求
- 秒杀系统的分类
- 商家为了营销而主动发起供用户争抢某种有限资源的秒杀,称为主动秒杀;
- 因供需关系紧张而造成的由用户发起,平台被动承担争抢过程的秒杀,称为被动秒杀;
- 秒杀系统的特点(分析问题,是什么)
- 瞬时的大量请求
- 三高
- 读多写少
- 数据强一致性
- 秒杀系统的主要目标(制定评判标准,为什么)
- 分析了秒杀系统有什么特点后,并针对每一个特点提供了解决方案后,要检测秒杀系统设计是否满足需求,需要给设计的系统制定一个评判标准,这就是主要目标;
- 从使用与被使用关系上,可以把秒杀系统分为三个部分:C 端用户、平台、B 端用户;C 端用户使用平台,B 端用户使用平台,平台服务于 C 端用户和 B 端用户
- C 端用户目标:保障用户体验,包括页面是否流畅、数据是否无误;
- B 端用户目标:保障用户商品购买时不出错,包括价格、数量、资金等各方面的数据无误;
- 平台目标:保障 C 端用户和 B 端用户完成用户目标,包括其他相关业务不会收到秒杀系统模块的牵连;
- 解决方案的主要思路(解决方案,怎么样)
- 分析了实施秒杀系统需要完成的目标后,就需要进行方案的落地,这是回答怎么样的问题;从后期项目的部署视图上,可以把秒杀系统分为三部分:客户端、中间件、服务端;客户端需要服务端提供服务,中间件为服务端提供更好的业务支撑;
- 客户端:保证资源加载速度、打散流量;可以采用 CND 的技术来保证就近提供服务,可以采用验证码、滑块、问答等方式打散流量;
- 中间件:对服务端提供稳定、可靠的服务;
- 服务端:保证高可用、
包括软件设计中的相关概念 软件质量评估与保证、软件开发模式、软件过程控制、软件架构设计