LOADING

Apache Dubbo集群容错

–>

在分布式应用中(微服务),通常会对服务进行集群部署来保障服务高可用。dubbo用于服务远程调用,远程服务是有可能出现异常情况的,如网络抖动,服务短暂不可用等情况,需要自动容错,服务降级或者mock测试,需要集群容错机制。

集群(Cluster)容错层:该层包含Cluster、Directory、Router、LoadBalance极大核心接口。注意区分Cluster层与Cluster接口,Cluster层是抽象概念,表示的是对外的整个集群容错层;Cluster接口是一个容错接口,提供Failover、Failfast等容错策略。

集群容错层的实现有很多,主要介绍一下AbstractClusterInvoke的全量流程。

1.Cluster的总体工作流程:

1)生成Invoker对象。不同的Cluster实现会生成不同类型的ClusterInvoker对象并返回,然后调用ClusterInvoker的Invoker方法,正式开始调用流程。

2)获得可调用的服务列表。首先会做前置校验,检查远程服务是否已被销毁。然后通过Directory#list方法获取所有可用的服务列表。接着使用Router接口处理该服务列表,根据路由规则过滤一部分服务,最终返回剩余的服务列表。

3)做负载均衡。在第2步中得到的服务列表还需要通过不同的负载均衡策略选出一个服务,用作最后的调用。首先框架会根据用户的配置,调用ExtensionLoader获取不同负载均衡策略的扩展点实现。然后做一些后置操作,如果是异步调用则设置调用编号。接着调用之类实现的doInvoke方法(父类专门留了这个抽象方法让之类实现),子类会根据具体的负载均衡策略选出一个可以调用的服务。

4)做RPC调用。首先保存每次调用Invoker到RPC上下文,并做RPC调用,然后处理调用结果,对于调用出现异常、成功、失败等情况,每种容错策略会有不同的处理方式。

2.容错机制的特性的介绍

Failsafe:调用失败也是安全的,在请求失败后,直接忽略异常。对请求做负载均衡,这种机制,不关心是否调用成功,并且不抛异常影响外层调用,可以用于一些不重要的日志同步场景,及时出现异常影响也不大。

Failfast:顾名思义,根据单词词义可知快速失败,当请求的服务失败后,会快速返回异常结果,不做重试,failfast容错机制会对请求做负载均衡,通常使用在非幂等性接口的调用上。这种机制受网络抖动的影响较大。

Failover:当请求调用失败后,会进行重试其他服务器,可以设置重试的次数,设置retries这个参数即可。failover是dubbo默认的容错机制,也会对请求做负载均衡。通常使用在读操作或幂等的写操作上,但重试会导致接口的延迟增大,在下游机器负载已经达到极限是,重试会加重下游服务的负载。

Failback:请求失败后,会自动记录在失败队列中,并由一个定时线程池定时重试,适用于异步或最终一致性的请求,请求会做负载均衡。

Forking:同时调用多个相同的服务,只要其中一个返回,则立即返回结果,用户可以设置forks参数设置来确定最大并行调用的服务数量。通常使用在对接口实时性要求极高的调用上,但也会浪费更多的资源。

Broadcast:广播模式,广播调用所有可用的服务,任意一个节点报错则报错。由于是广播,因此请求不需要做负载均衡。通常用于服务状态更新后的广播。

Mock:提供调用失败是,返回伪造的响应结果。或直接强制返回伪造的结果,不会发起远程调用

Available:最简单的方式,请求不会做负载均衡,遍历所有服务列表,找到第一个可用节点,直接请求并返回结果。如果没有可用的节点,直接抛出异常。

Mergeable:可以自动吧多个节点请求得到的结果进行合并。

官网有个表格,总结的很详细:http://dubbo.apache.org/zh-cn/docs/user/maturity.html

3,负载均衡算法

dubbo内置了4中负载均衡算法,当然也可以自己自定义实现其他轮询算法。

本文中的理论部分参考了图书《深入理解Apache Dubbo与实战》 图书作者:诣极  林琳

 

 

本文来源 互联网收集,文章内容系作者个人观点,不代表 本站 对观点赞同或支持。如需转载,请注明文章来源,如您发现有涉嫌抄袭侵权的内容,请联系本站核实处理。

© 版权声明

相关文章