一致性哈希
一般的哈希在处理负载均衡的时候,实例集合的状况和哈希使用的哈希函数是耦合的,那么在实例的集合状况(之所以说状况是因为存在数量和权重)改变的时候就需要重置哈希算法,这是不现实的。
一致性哈希中的一致性是指,需要客户端请求和请求对应的服务都经过哈希函数映射到一个域中,使用域中客户端请求之后的那个服务。
断路器模式(熔断)
断路器是一个在真实的服务上(因为在外部看来没有断路器)检查请求处理状态的代理,根据请求的处理状态,决定是否使一个请求到达真正的服务上(本质属于快速失败)。通常具有 3 种状态,closed:断路器关闭,请求不受影响;open:断路器运行,拒绝请求;half-open:在断路器开始拒绝响应的一段时间之后,需要尝试这个服务是否开始正常的工作,允许少量的请求通过。
服务降级
在服务无法正常响应的时候,转而使用一种“弱于正常情况的”响应,(比如将正常响应转化为“稍后再试“的提示,或者进行故障转移,去请求备用的实例)。
舱壁隔离
避免某个服务实例影响整个服务。
举个具体的例子比如一个 tomcat 应用的一部分接口依赖与某个服务,而其余大部分接口与这个服务无关。我们现在假设这个服务出现问题到达这个服务上的所有请求均无法获取到响应,每秒将阻塞一条 tomcat 中的请求线程。那么大约在 400 秒之后,tomcat 就会因为线程池全部被占用而无法处理新的请求,结果就是 tomcat 之后的全部服务都无法请求,明明只是一种服务的一个实例出了问题。
解决方式是在 tomcat 中为每个服务设立单独的线程池,或者是信号量计数,最终达到的目的都是限制对某个服务的请求所用的资源占当前服务的整体资源的比例。
重试
在服务临时性失败的时候应该重新请求,避免因为网络抖动,临时性过载造成的失败。
需要遵循几个条件:1. 主路关键服务;2. 对造成的原因进行判断,在非临时性失败的请求上不使用;3. 服务幂等;4. 明确终止条件