系统设计的复杂性在于没有一种通用的设计可以适应所有场景。以下我将分享一些实用的规则,帮助你在面试中逆袭。
1. 对于读取密集的系统,考虑使用缓存。
2. 对于写入密集的系统,利用消息队列进行异步处理。
3. 为了满足低延迟的要求,可以考虑使用缓存和CDN。
4. 如果需要数据库满足ACID(原子性、一致性、隔离性、持久性)准则,那么就选择关系型数据库/SQL数据库。
5. 如果你有非结构化数据,选择NoSQL数据库。
6. 如果需要处理复杂的数据,如视频、图片、文件等,就使用Blob或对象存储。
7. 对于复杂的预计算,使用消息队列和缓存。
8. 若要进行大数据量的搜索,可以考虑使用搜索索引、字典树或搜索引擎。
9. 想要扩大SQL数据库的规模,则需要实施数据库分片技术。
10. 如果系统需要实现高可用性、出色的性能和高吞吐率,就使用负载均衡器。
11. 如需全球数据传送,考虑使用CDN。
12. 如果处理的是图形类数据,并且含有节点、边和关系的数据,就使用图数据库。
13. 若要扩展各种组件,要实行水平扩展。
14. 如果你需要加快数据库查询,使用数据库索引。
15. 批量作业处理,可以考虑进行批处理并使用消息队列。
16. 若需管理服务器负载并防止DOS攻击,使用速率限制器。
17. 在微服务架构中,使用API网关实现各功能。
18. 针对单点故障问题,应实施冗余设计。
19. 为了达到容错和数据持久性,要实施数据复制。
20. 实现用户间的快速通信,采用Websockets。
21. 在分布式系统中实现故障检测,要采用心跳机制。
22. 维护数据完整性,可使用校验和算法。
23. 提高服务器扩展效率,采用一致性哈希。
24. 如果需要分散式的数据传输,可以考虑流言协议。
25. 对于基于位置的功能性需求,采用四叉树、地理散列等方案。
26. 避免使用特定的技术名词,应使用通用术语。
27. 如果需要在高可用性和一致性之间做出权衡,可以采取最终一致性策略。
28. 对于IP解析和域名查询,需要提及DNS。
29. 当需要处理网络请求中的大数据时,实施分页。
30. 实现缓存的清除策略,优先采用LRU(最近最少使用)缓存。
31. 处理流量高峰:实施动态管理资源的自动扩容
32. 如果你需要进行数据分析和审计跟踪,考虑使用数据湖或只追加数据库;
33. 处理大规模的并发连接,使用连接池并考虑使用Protobuf来减少数据有效负载。