前一篇文章我们讲到, 一切单点都是不可靠的, 如果系统中某个地方可能会出问题(就算概率很低),那么它迟早会出问题。 也就是我们常说的Murphy’s Law。如果要提高系统的可用性, 那么就必须尽可能消灭掉系统中所有的单点,并且在发生故障时,把流量自动转移到运行正常的节点。
在这篇文章中, 我会以互联网产品后端常见的架构为例, 讲述如何达到这个目标。
1.常见系统架构
互联网后端应用的常见架构可以用上图来简单描述(简化了单机房内其他系统、多机房等):
- 在App或浏览器端, 通过DNS或自己的路由机制, 把域名解析为IP, 从而进行网络通信
- 后端系统的最外层, 通常是负载均衡器, 把流量分摊到下游的API (当然, LB内部也可以分更多层)
- API层处理业务逻辑,同时也会依赖下游服务。比如处理创建用户的请求, API层可能需要做输入内容的校验,然后调用下游用户服务来完成创建工作
- 服务层往往有自己的存储系统, 涉及到数据库、缓存, 同时也会利用MQ与其他系统进行解耦通信(当然API层可能也有)
- 与下游进行通信前,都需要通过服务发现机制,获取到下游的具体实例信息, 方可进行通信