Dubbo集群容错模式之Broadcast实现

- 日理万妓 2021-09-20 04:10 407阅读 0赞

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

注: Dubbo版本是2.6.2

  1. ![175841_49aL_2518341.png][]
  2. 1 DubboBroadcastClusterInvoker类继承图

1.Broadcast的含义

  1. 即广播,每个接收者都能收到消息。

2.Dubbo中是怎么实现

  1. 核心代码在BroadcastClusterInvokerdoInvoke(Invocation,List<Invoker<T>>,LoadBalance)中,源码如下。
  2. @Override
  3. @SuppressWarnings({"unchecked", "rawtypes"})
  4. public Result doInvoke(final Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException {
  5. checkInvokers(invokers, invocation);
  6. RpcContext.getContext().setInvokers((List) invokers);
  7. RpcException exception = null;
  8. Result result = null;
  9. for (Invoker<T> invoker : invokers) {
  10. try {
  11. result = invoker.invoke(invocation);
  12. } catch (RpcException e) {
  13. exception = e;
  14. logger.warn(e.getMessage(), e);
  15. } catch (Throwable e) {
  16. exception = new RpcException(e.getMessage(), e);
  17. logger.warn(e.getMessage(), e);
  18. }
  19. }
  20. if (exception != null) {
  21. throw exception;
  22. }
  23. return result;
  24. }
  25. 循环遍历所有的服务提供者,逐个进行请求,如果有异常出现,则记录日志。需要注意的是,Dubbo中,这里并未使用多线程,所以个人估计如果服务提供者数量众多或者请求处理耗时长,则整体的耗时应该会长,所以最好根据业务场景,进行合理的选择。
  26. 由于上面的源码可以看出,轮询请求过程中,任意一个抛出异常,并不会中断后面的请求,只有在所有请求处理完成后,才会去检查异常。只有所有的请求都成功的情况下,才会将最后一次调用的结果返回。

3.思考

  1. 如果这个广播过程用线程池实现,该怎么实现,我们需要考虑额外的哪些问题?这个留给读者思考。

转载于:https://my.oschina.net/u/2518341/blog/1814975

发表评论

表情:
评论列表 (有 0 条评论,407人围观)

还没有评论,来说两句吧...

相关阅读

    相关 dubbo容错

    为了避免单点故障,现在的应用通常至少会部署在两台服务器上。对于一些负载比较高的服务,会部署更多的服务器。这样, 在同一环境下的服务提供者数量会大于1。对于服务消费者来说,同一环

    相关 谈谈dubbo容错

    从继承图可以看出有以下几种策略: Failover Cluster(失败转移) 当调用提供者的服务器发生错误时,再试下一个服务器。 用于读操作。重试有延时。设置重试次数

    相关 Dubbo容错

    Dubbo官网:[dubbo 2.7  集群容错][dubbo 2.7_] 集群容错指的是,当消费者调用提供者集群时发生异常的处理方案 一、Dubbo内置的容错策略

    相关 Dubbo-容错

    当一个项目(应用或服务)放在多台服务器上时,怎么实现高可用,这就是集群容错。 \------------------------------------------

    相关 Dubbo——容错

    Cluster层概述 在微服务环境中,为了保证服务的高可用,很少会有单点服务出现,服务通常都是以集群的形式出现的。然而,被调用的远程服务并不是每时每刻都保持良好状况,当某