未完成
# 为什么这么设计系列文章
2020-04-19 为什么这么设计 (opens new window) 系统设计 (opens new window)
为什么这么设计(Why’s THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点、对具体实现造成的影响。如果你有想要了解的问题,可以在文章下面留言。
# 网络
- 001 为什么 TCP 建立连接需要三次握手 (opens new window)
- 005 为什么 DNS 使用 UDP 协议 (opens new window)
- 012 为什么 TCP 协议有性能问题 (opens new window)
- 013 为什么 UDP 头只有 8 个字节 (opens new window)
- 017 为什么 TCP/IP 协议会拆分数据 (opens new window)
- 018 为什么流媒体直播的延迟很高 (opens new window)
- 019 为什么 HTTPS 需要 7 次握手以及 9 倍时延 (opens new window)
- 020 为什么 TCP 协议有粘包问题 (opens new window)
- 021 为什么 TCP 协议有 TIME_WAIT 状态 (opens new window)
- 026 为什么 MAC 地址不需要全球唯一 (opens new window)
- 027 为什么 IPv6 难以取代 IPv4 (opens new window)
- 028 为什么集群需要 Overlay 网络 (opens new window)
# 数据库
- 003 为什么 Redis 选择单线程模型 (opens new window)
- 009 为什么 MySQL 使用 B+ 树 (opens new window)
- 010 为什么 Redis 快照使用子进程 (opens new window)
- 011 为什么 MongoDB 使用 B 树 (opens new window)
- 015 为什么数据库会丢失数据 (opens new window)
- 016 为什么比特币可以防篡改 (opens new window)
- 024 为什么 MySQL 的自增主键不单调也不连续 (opens new window)
- 031 为什么数据库不应该使用外键 (opens new window)
- 036 为什么 OLAP 需要列式存储 (opens new window)
# 操作系统
- 023 为什么 Linux 需要虚拟内存 (opens new window)
- 029 为什么系统调用会消耗较多资源 (opens new window)
- 030 为什么 Linux 默认页大小是 4KB (opens new window)
- 032 为什么 CPU 访问硬盘很慢 (opens new window)
- 033 为什么 NUMA 会影响程序的延迟 (opens new window)
- 034 为什么 HugePages 可以提升数据库性能 (opens new window)
- 035 为什么 Linux 需要 Swapping (opens new window)
- 038 为什么早期的 Windows 需要整理碎片 (opens new window)
- 039 为什么 Linux 和 macOS 不需要碎片整理 (opens new window)
# 软件工程
- 002 为什么使用通信来共享内存 (opens new window)
- 004 为什么你应该使用 Git 进行版本控制 (opens new window)
- 006 为什么使用 MD5 存储密码非常危险 (opens new window)
- 007 为什么基础服务不应该高可用 (opens new window)
- 008 为什么总是需要无意义的 ID (opens new window)
- 018 为什么流媒体直播的延迟很高 (opens new window)
- 022 为什么 0.1 + 0.2 = 0.300000004 (opens new window)
- 025 为什么 0.1 + 0.2 = 0.3 (opens new window)
- 037 为什么 Kubernetes 要替换 Docker (opens new window)
# 全部文章
总结
- 微服务架构整个应用分散成多个服务,定位故障点非常困难。
- 稳定性下降。服务数量变多导致其中一个服务出现故障的概率增大,并且一个服务故障可能导致整个系统挂掉。事实上,在大访问量的生产场景下,故障总是会出现的。
- 服务数量非常多,部署、管理的工作量很大。
- 开发方面:如何保证各个服务在持续开发的情况下仍然保持协同合作。
- 测试方面:服务拆分后,几乎所有功能都会涉及多个服务。原本单个程序的测试变为服务间调用的测试。测试变得更加复杂。
# 参考链接
编辑 (opens new window)
上次更新: 2024-07-15, 08:03:22