系统设计的面试题是一个开放式的对话,大体可以分成四个步骤:
一些常见的优化方案:
我们将问题的范畴限定在如下用例:
范畴之外的用例:
状态假设:
估算使用情况:
用例:输入文本,保存后得到一个随机链接
用例:输入一个链接,可以查看分享的内容
用例:用户行为统计与分析
非实时分析的功能可以通过 MapReduce 之类的服务来计算点击率之类的数据
我们将问题的范畴限定在如下用例:
范畴之外的用例:
状态假设:
估算使用情况:
用例:用户发表推文
用例:用户浏览自己主页的时间线
用例:用户浏览其他用户的时间线
用例:用户搜索某个关键词
一些额外优化的点:
方法论上,高可用是通过冗余+自动故障转移来实现的。
整个互联网分层系统架构的高可用,又是通过每一层的冗余+自动故障转移来综合实现的,具体的:
(1)【客户端层】到【反向代理层】的高可用,是通过反向代理层的冗余实现的,常见实践是keepalived + virtual IP自动故障转移
(2)【反向代理层】到【站点层】的高可用,是通过站点层的冗余实现的,常见实践是 nginx 与 web-server 之间的存活性探测与自动故障转移
(3)【站点层】到【服务层】的高可用,是通过服务层的冗余实现的,常见实践是通过 service-connection-pool 来保证自动故障转移
(4)【服务层】到【缓存层】的高可用,是通过缓存数据的冗余实现的,常见实践是缓存客户端双读双写,或者利用缓存集群的主从数据同步与 sentinel 保活与自动故障转移;更多的业务场景,对缓存没有高可用要求,可以使用缓存服务化来对调用方屏蔽底层复杂性
(5)【服务层】到【数据库读】的高可用,是通过读库的冗余实现的,常见实践是通过 db-connection-pool 来保证自动故障转移
(6)【服务层】到【数据库写】的高可用,是通过写库的冗余实现的,常见实践是 keepalived + virtual IP 自动故障转移
参考资料: