相关参数在
org.apache.dubbo.common.constants.ClusterRules
策略名称 | 作用 | 使用场景 |
failover | 失败启动切换 | 通常用于读操作 |
failfast | 快速失败 | 通常用于非幂等写操作,比如新增记录 |
failsafe | 失败安全 | 通常用于写入审计日志等操作 |
failback | 失败自动恢复 后台记录失败的请求,然后定时重发 | 通常用于消息通知相关的操作 |
forking | 并行调用多个服务器,只要一个成功就返回 | 通常用于实时性要求较高的读操作,需要浪费更多资源,通过 forks=2 设置最大并行数 |
broadcast | 广播调用所有提供者,逐个调用,任何一台报错则报错 | 通常用于通知所有提供者更新缓存或日志等本地资源信息 |
默认值 failover
对应策略的异常信息如下
@DubboReference(cluster = ClusterRules.FAIL_OVER)
org.apache.dubbo.rpc.RpcException: Invoke remote method timeout. method: getHello, provider: DefaultServiceInstance{serviceName='my-fault-tolerance-provider', host='192.168.106.105', port=20881, enabled=true, healthy=true, metadata={dubbo.endpoints=[{"port":20881,"protocol":"dubbo"}], dubbo.metadata-service.url-params={"connections":"1","version":"1.0.0","dubbo":"2.0.2","release":"3.0.7","side":"provider","port":"20881","protocol":"dubbo"}, dubbo.metadata.revision=d9eea05f8a4e8ec289758c67ec03017f, dubbo.metadata.storage-type=local}}, service{name='com.ghy.www.api.Service1',group='null',version='null',protocol='dubbo',params={side=provider, release=3.0.7, methods=getHello, logger=slf4j, deprecated=false, dubbo=2.0.2, interface=com.ghy.www.api.Service1, service-name-mapping=true, generic=false, application=my-fault-tolerance-provider, background=false, dynamic=true, anyhost=true},}, cause: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2023-11-05 17:08:32.621, end time: 2023-11-05 17:08:33.648, client elapsed: 0 ms, server elapsed: 1027 ms, timeout: 1000 ms, request: Request [id=14, version=2.0.2, twoway=true, event=false, broken=false, data=null], channel: /192.168.106.105:55533 -> /192.168.106.105:20881
@DubboReference(cluster = ClusterRules.FAIL_FAST)
org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2023-11-05 17:05:44.807, end time: 2023-11-05 17:05:45.829, client elapsed: 1 ms, server elapsed: 1021 ms, timeout: 1000 ms, request: Request [id=4, version=2.0.2, twoway=true, event=false, broken=false, data=null], channel: /192.168.106.105:55533 -> /192.168.106.105:20881
@DubboReference(cluster = ClusterRules.FAIL_SAFE)
org.apache.dubbo.rpc.RpcException: Invoke remote method timeout. method: getHello, provider: DefaultServiceInstance{serviceName='my-fault-tolerance-provider', host='192.168.106.105', port=20881, enabled=true, healthy=true, metadata={dubbo.endpoints=[{"port":20881,"protocol":"dubbo"}], dubbo.metadata-service.url-params={"connections":"1","version":"1.0.0","dubbo":"2.0.2","release":"3.0.7","side":"provider","port":"20881","protocol":"dubbo"}, dubbo.metadata.revision=d9eea05f8a4e8ec289758c67ec03017f, dubbo.metadata.storage-type=local}}, service{name='com.ghy.www.api.Service3',group='null',version='null',protocol='dubbo',params={side=provider, release=3.0.7, methods=getHello, logger=slf4j, deprecated=false, dubbo=2.0.2, interface=com.ghy.www.api.Service3, service-name-mapping=true, generic=false, application=my-fault-tolerance-provider, background=false, dynamic=true, anyhost=true},}, cause: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2023-11-05 17:11:07.645, end time: 2023-11-05 17:11:08.669, client elapsed: 0 ms, server elapsed: 1024 ms, timeout: 1000 ms, request: Request [id=22, version=2.0.2, twoway=true, event=false, broken=false, data=null], channel: /192.168.106.105:55533 -> /192.168.106.105:20881
@DubboReference(cluster = ClusterRules.FAIL_BACK)
无异常
@DubboReference(cluster = ClusterRules.FAIL_OVER, retries = 5)
org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2023-11-05 17:22:17.388, end time: 2023-11-05 17:22:18.422, client elapsed: 0 ms, server elapsed: 1034 ms, timeout: 1000 ms, request: Request [id=3058, version=2.0.2, twoway=true, event=false, broken=false, data=null], channel: /192.168.106.105:55535 -> /192.168.106.105:20883
@DubboReference(cluster = ClusterRules.FAIL_BACK, retries = 5)
org.apache.dubbo.rpc.RpcException: Invoke remote method timeout. method: getHello, provider: DefaultServiceInstance{serviceName='my-fault-tolerance-provider', host='192.168.106.105', port=20883, enabled=true, healthy=true, metadata={dubbo.endpoints=[{"port":20883,"protocol":"dubbo"}], dubbo.metadata-service.url-params={"connections":"1","version":"1.0.0","dubbo":"2.0.2","release":"3.0.7","side":"provider","port":"20883","protocol":"dubbo"}, dubbo.metadata.revision=d9eea05f8a4e8ec289758c67ec03017f, dubbo.metadata.storage-type=local}}, service{name='com.ghy.www.api.Service9',group='null',version='null',protocol='dubbo',params={side=provider, release=3.0.7, methods=getHello, logger=slf4j, deprecated=false, dubbo=2.0.2, interface=com.ghy.www.api.Service9, service-name-mapping=true, generic=false, application=my-fault-tolerance-provider, background=false, dynamic=true, anyhost=true},}, cause: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2023-11-05 17:27:53.514, end time: 2023-11-05 17:27:54.533, client elapsed: 1 ms, server elapsed: 1018 ms, timeout: 1000 ms, request: Request [id=3077, version=2.0.2, twoway=true, event=false, broken=false, data=null], channel: /192.168.106.105:55535 -> /192.168.106.105:20883
@DubboReference(cluster = ClusterRules.FORKING)
无异常
@DubboReference(cluster = ClusterRules.BROADCAST)
org.apache.dubbo.rpc.RpcException: Invoke remote method timeout. method: getHello, provider: DefaultServiceInstance{serviceName='my-fault-tolerance-provider', host='192.168.106.105', port=20881, enabled=true, healthy=true, metadata={dubbo.endpoints=[{"port":20881,"protocol":"dubbo"}], dubbo.metadata-service.url-params={"connections":"1","version":"1.0.0","dubbo":"2.0.2","release":"3.0.7","side":"provider","port":"20881","protocol":"dubbo"}, dubbo.metadata.revision=d9eea05f8a4e8ec289758c67ec03017f, dubbo.metadata.storage-type=local}}, service{name='com.ghy.www.api.Service6',group='null',version='null',protocol='dubbo',params={side=provider, release=3.0.7, methods=getHello, logger=slf4j, deprecated=false, dubbo=2.0.2, interface=com.ghy.www.api.Service6, service-name-mapping=true, generic=false, application=my-fault-tolerance-provider, background=false, dynamic=true, anyhost=true},}, cause: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2023-11-05 17:37:01.405, end time: 2023-11-05 17:37:02.429, client elapsed: 0 ms, server elapsed: 1024 ms, timeout: 1000 ms, request: Request [id=3121, version=2.0.2, twoway=true, event=false, broken=false, data=null], channel: /192.168.106.105:55533 -> /192.168.106.105:20881
FAIL_FAST 和 FAIL_OVER 的异常为 org.apache.dubbo.remoting.TimeoutException
FAIL_OVER、FAIL_SAFE、FAIL_BACK、BROADCAST 的异常为 org.apache.dubbo.rpc.RpcException