在如何构建高可用的系统(一):Overview中, 我提到了以下几点:
- 系统依赖的一切下游系统都是不可靠的, 它们随时可能出问题
- 系统的上游可能有多个, 而且每个上游的行为都是不可预知的。如果某个上游抽风把我的系统搞崩, 那么就会影响所有的上游
- 高可用是有前提条件的,一个系统对当前的负载能提供高可用, 不代表负载上升之后仍然高可用
如果把这几个问题,映射到现在非常流行的“微服务架构”下,就可以统一用“服务治理”来概括。 下面我们具体探讨下,如何解决这几个问题。
1. 下游管理
系统所依赖的各个下游系统是不可靠的, 它们随时可能会出问题。 比如我们开发了一个用户服务, 会访问数据库、缓存等, 那这些下游的数据库、缓存出问题的时候, 我们该怎么办呢?
1.1 降级措施
当下游出现问题时, 我们的服务或多或少都会受影响。 为了保证核心场景仍然高可用, 我们需要把相关功能降级,以减少损失。 比如以下场景:
当数据库挂掉的时候,所有对数据库的读写都会失败。 为了使创建用户的功能仍然对外可用, 我们可以选择打开降级开关, 把创建用户的请求发到消息队列中, 在数据库恢复之后, 从队列中拉取消息, 再把数据写入数据库中。
对上游来说,写入成功之后, 当然得能通过读接口获取到数据。 因此, 我们还得把数据写入到缓存中, 这样即使数据库挂了, 上游也能够尽量不受影响。
这里只是随便举了个降级的例子, 在实际场景中, 降级处理方案还是得仔细思考,具体问题具体分析。
1.2 超时
在很多场景下, 服务接收到一个请求后, 会调用非常多的下游, 当调用某个下游的请求迟迟没有得到响应, 会造成两个结果:
- 整个请求的响应时长上升, 调用方在等待一段时间后,不再等