作者回复: 赞!基本上就是靠猜和试探,试探也是固定套路,你已经总结得很对了。 你考虑得非常深远了。 这种健康中心的想法应该说之前也有人探讨过,后来就是发现监控做得好,不太需要这么一个健康中心。比如说我们的监控都会采集各个机器的 CPU,内存之类的东西。 所以现在其实是缺了一个能够综合运用各种监控指标打分的东西,但是一直以来也没有谁研究出来了通用的打分机制——适合各种业务的打分机制。 早期我还想过,能不能借助 AI 来学习人判断节点是否健康的思路,然后让 AI 来监控、打分、执行容错。还可以进一步整合日志分析、流量预判等,做得非常高级。 当然,这都是吹牛逼,我稍稍尝试过就放弃了。
作者回复: 现在的主流是根据错误率来判断要不要熔断,这个错误可以是业务错误,也可以是系统错误(比如中间件本身的错误)。当错误率比较高的时候就会触发熔断。 我之前就用过这种策略,比较好实现。
作者回复: 我愿称你为课代表,总结太强了! Question:其实我在面试的也会有这种困境,毕竟有些业务我确实没有解决过,只是听说过。 这里要分情况讨论: 1. 面试官问的场景是你确实要解决的,不过你用了 A 方案,但是你面试的时候还回答了 B,C 方案。这种,我一般就是先讲自己的 A 方案,讲完之后看情况,要是面试官觉得 A 不符合口味,就接着讲自己了解的 B 方案和 C 方案。正常来说,在做方案选型的时候,我多半比较过 B 和 C,但是最终选了 A。我只需要讲完 B C 之后讲一下自己当初的决策理由就可以。因为本身我落地的是 A,B 和 C 被我放弃了,问题也不太大。 2. 如果是这个场景跟我业务没有关系,比如说我的项目经历是支付方向,问我的场景是订单方向,我也就只能把公司的解决方案拿出来说说。问到一些答不出来的细节很正常,毕竟我项目经历又不是这个地方的。不过一般要避免面试官不按套路出牌,也就是最好别让自己陷入这种境地。 你在面试前,可以提前准备一下各种方案,包括如果真落地可能遇到什么问题,又或者你去搜搜业界落地的技术博客,也能回答上来一些细节性的问题。
作者回复: 对的!按比例是偷懒的做法,你讲的这是基于反馈的流量恢复,是更加高级的方案。
作者回复: 严格来说,如果你的异常机制(Go 中的错误机制)设计得好,你是知道的。比如说,你们有严格的错误码机制,每一个业务都有自己的错误码前缀,那么你根据错误码就知道究竟是谁出错了,也就是你能区别是自身、还是下游。 而如果没有这种机制,你基本上判断不出来是自身,还是下游引起的。这时候对你来说已经不重要了,你直接将自身熔断了就可以。 而单机故障还是集群故障,你站在调用者角度永远都是认为下游是单机故障。比如说 A 调用 B,如果 A 调不通,它只会认为是它调用的 B 的那个节点崩了,而不会认为 B 整个集群都崩了。 集群故障是需要第三方来监控的。比如说你有 prometheus 监控,你发现所有的节点都各种超时,或者异常很多,这样你才能判定是整个集群都出问题了。 如果你利用的是负载均衡 fail-over 机制,或者你的客户端会给服务端发送心跳,那么服务端所有节点都调不通,也可以认为是集群崩溃了。
作者回复: 是的,熔断也可以这么做。应该说,熔断、限流、降级都可以这么做。推而广之,任何原因导致服务端不可用,或者说有性能问题,都可以在负载均衡里面的将它暂时挪出可用列表。
作者回复: 会!你已经领悟到了面试另外一个可以提及的亮点。正常来说,你后端的节点处理能力是有冗余的,那么一两个节点熔断,这些冗余的处理能力刚好够用。 但是如果你要是大部分节点都已经快要撑不住流量了,那么你这时候一两台机器熔断,就会导致其它节点也撑不住。 所以这种流量的场景,用限流会更好。
作者回复: 这里的客户端基本上都是指服务调用中的客户端。比如说 A 调用 B 的接口,那么 A 就是客户端。 整个专栏,基本上都是这种语义,如果是APP 之类的,我一般都会直接说 APP,或者用户。
作者回复: 赞!确实可以的。不过面试的时候你还可以讲讲你们公司有没有什么自动处理告警的机制。因为有些故障是可以通过程序来恢复的。 不过你们的真的是服务一不通就告警吗?还是说会有考虑一分钟多少次调不通才告警?
作者回复: 第一种思路是按错误类型。这个可以是跟业务相关的,也可以是跟业务没关的。比如说当你发现返回了某一个特定的错误(或者异常),就认为系统本身出了故障,那么就可以触发熔断。 第二种思路是检测业务关键路径上的依赖。比如说你严重依赖于某一个中间件,例如 Redis,那么当你发现 Redis 连不上,比如说心跳已经 ping 不通了,那么就可以触发熔断(后面学了降级,你就应该考虑应该尽可能先降级)。 QPS 很低的话,你加一个限流会更好,防止突发流量。