Golang面试专题 - 设计题

收藏

设计题

1. 要设计一个秒杀系统要注意什么?

前端秒杀页面

页面静态化:将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态 元素。通过 CDN 来抗峰值。

禁止重复提交:用户提交之后按钮置灰,禁止重复提交。

用户限流:在某一时间段内只允许用户提交一次请求,比如可以采取 IP 限流。

服务端控制器 (网关)

限制uid访问频率:我们上面拦截了浏览器访问的请求,但针对某些恶意攻击或其它插件,在服务端控制层需要针对同一个访问 uid,限制访问频率。

服务层

采用消息队列缓存请求:既然服务层知道库存只有 100 台手机,那完全没有必要把 100W 个请求都传递到数据库啊,那么可以先把这些请求都写到消息队列缓存一下,数据库层订阅消息减库存,减库存成功的请求返回秒杀成功,失败的返回秒杀结束。

利用缓存应对读请求:对类似于 12306 等购票业务,是典型的读多写少业务,大部分请求是查询请求,所以可以利用缓存分担数据库压力。

利用缓存应对写请求:缓存也是可以应对写请求的,比如我们就可以把数据库中的库存数据转移到 Redis 缓存中,所有减库存操作都在 Redis 中进行,然后再通过后台进程把 Redis 中的用户秒杀请求同步到数据库中。

数据库层

数据库层是最脆弱的一层,一般在应用设计时在上游就需要把请求拦截掉,数据库层只承担 “能力范围内” 的访问请求。所以,上面通过在服务层引入队列和缓存,让最底层的数据库高枕无忧。

2. 要设计一个类似微信红包架构系统要注意什么?

南北分区

快慢分离

Hash负载均衡

Cache屏蔽DB

双维度分库表

查看资料