综合了负载均衡算法和熔断措施地方案
放开流量是在服务端处理的,也就是服务端还是收到了100%的流量,只不过有部分流量会被放过去并且被正常处理。
一个自然的想法是为什么不直接让客户端来控制这个流量
)
这里进一步结合在负载均衡里提到的根据调用结果来调整负载均衡策略的讨论,可以让客户端也采用这种负载均衡策略。
整体流程:
- 服务端在触发熔断的时候,会返回一个代表熔断的错误
- 客户端收到这个错误之后,会把这个服务端节点暂时挪出可用节点列表。后续所有熔断请求都不会打到这个节点上了
- 客户端等待一段时间后,逐步放开流量
- 如果服务端正常处理了新来的请求,就让客户端加大流量
- 如果服务端再次返回了熔断响应,客户端就会再一次把这个节点挪出可用列表
- 如此循环,直到完全恢复
可以这么回答,关键词是负载均衡
整体思路是利用负载均衡来控制流量。如果一个服务端节点触发了熔断,那么客户端在做负载均衡的时候就可以将这个节点挪出可用列表,后续请求会发给别的节点。在经过一段时间之后,客户端可以尝试发请求给该节点。如果该节点正确处理了,那客户端就可以加大流量。否则客户端就要再一次等待一段时间。
万一所有可用节点都触发熔断了,应该怎么办?
这个方案是需要兜底的,比如说如果因为某些原因数据库出问题,导致某个服务所有的节点都触发了熔断,那么客户端就完全没有可用节点了。不过这个问题本身熔断解决不了,负载均衡也解决不了,只能通过监控告警之后人手工介入处理了。