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