之前在面试头条后端开发岗位,碰到了一个开放型问题:设计一个短域名系统。leetcode有该方案的讨论,侧重于算法实现,本文主要讨论整体网站设计。
由于是开发性试题,一般是不提示,不限制,因此清晰的思路尤为重要。对于系统设计,个人工作经验总结是,抓住数据流向这条线来解答。一般分为数据源(数据怎么来,规模多大),数据处理逻辑(数据进入系统如何处理),数据存储方案等三步来设计。
-
a. 数据源
- 就本题,数据通过接口调用进入后端系统,域名数据量很大,比较分散,系统QPS大时需要通过 DNS轮询 -> LVS集群 -> Nginx -> 后端服务。
-
b. 数据处理
- 长域名 -> 短域名,短域名 -> 长域名。长 -> 短,采用Hash进行映射(需要解决Hash冲突问题)。 短 -> 长,由于Hash不可逆,所以需要用数据库存储映射关系。
-
c. 数据存储
- 由于数据量大,查询为主,所以可以用mongo集群存储。
-
d. 其它
- 系统设计通用设计,包括权限分配,日志监控,代码规范,模块解耦等。