集群容错系列文章:
Failover Cluster 失败自动切换
Failfast Cluster 快速失败,抛出异常
Failsafe Cluster 快速失败,不抛出异常
Failback Cluster 失败后定时重试
Forking Cluster 并行调用多个实例,只要一个成功就返回
Broadcast Cluster 广播调用所有实例,有一个报错则抛出异常
Available Cluster 可用的实例
Mergeable Cluster 合并结果
本文简单介绍 Dubbo 中的 Broadcast Cluster(广播调用所有提供者,逐个调用,任何一台报错则报错)。
简介
广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
如何使用
<dubbo:service cluster="broadcast" />
或
<dubbo:reference cluster="broadcast" />
实现逻辑
- 循环调用所有的实例
- 如果有发生异常则记录异常保存
- 只要有异常,则抛出异常,如果没有则返回执行结果
源代码
public class BroadcastClusterInvoker<T> extends AbstractClusterInvoker<T> {
private static final Logger logger = LoggerFactory.getLogger(BroadcastClusterInvoker.class);
public BroadcastClusterInvoker(Directory<T> directory) {
super(directory);
}
@Override
@SuppressWarnings({"unchecked", "rawtypes"})
public Result doInvoke(final Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException {
checkInvokers(invokers, invocation);
RpcContext.getContext().setInvokers((List) invokers);
RpcException exception = null;
Result result = null;
// 广播到所有的被调用实例
for (Invoker<T> invoker : invokers) {
try {
result = invoker.invoke(invocation);
} catch (RpcException e) {
// 记录异常
exception = e;
logger.warn(e.getMessage(), e);
} catch (Throwable e) {
// 记录异常
exception = new RpcException(e.getMessage(), e);
logger.warn(e.getMessage(), e);
}
}
// 只要有一个实例有异常则报错
if (exception != null) {
throw exception;
}
return result;
}
}
做个有梦想的程序猿
![个人公众号](https://i-blog.csdnimg.cn/blog_migrate/851d84ee1e21a8a05c65072bc4bf6fc8.jpeg)