zoukankan      html  css  js  c++  java
  • Dubbo之负载均衡、并发控制、延迟暴露、连接控制

    1、并发控制

    dubbo服务端和消费端都做了并发控制,分别在配置中有相应的对应配置:

    服务端:executes服务提供者每服务每方法最大可并行执行请求数,控制并发数量;actives每服务消费者每服务每方法最大并发调用数,控制占用链接的请求数量;Provider处理请求时,统计方法维度的调用情况,如果并发数超过设置的最大值,则阻直接抛出异常。
    消费端:actives每服务消费者每服务每方法最大并发调用数;Consumer 调用时,统计服务和方法维度的调用情况,如果并发数超过设置的最大值,则阻塞当前线程,直到前面有请求处理完成。
    如果服务端和消费端同时都配置了actives,消费端优先。

    配置样例
    样例 1
    限制 com.foo.BarService 的每个方法,服务器端并发执行(或占用线程池线程数)不能超过 10 个:

    <dubbo:service interface="com.foo.BarService" executes="10" />
    样例 2
    限制 com.foo.BarService 的 sayHello 方法,服务器端并发执行(或占用线程池线程数)不能超过 10 个:

    <dubbo:service interface="com.foo.BarService">
    <dubbo:method name="sayHello" executes="10" />
    </dubbo:service>
    样例 3
    限制 com.foo.BarService 的每个方法,每客户端并发执行(或占用连接的请求数)不能超过 10 个:

    <dubbo:service interface="com.foo.BarService" actives="10" />

    <dubbo:reference interface="com.foo.BarService" actives="10" />
    样例 4
    限制 com.foo.BarService 的 sayHello 方法,每客户端并发执行(或占用连接的请求数)不能超过 10 个:

    <dubbo:service interface="com.foo.BarService">
    <dubbo:method name="sayHello" actives="10" />
    </dubbo:service>

    <dubbo:reference interface="com.foo.BarService">
    <dubbo:method name="sayHello" actives="10" />
    </dubbo:service>
    如果 <dubbo:service> 和 <dubbo:reference> 都配了actives,<dubbo:reference> 优先,参见:配置的覆盖策略。

    2、延迟暴露
    Dubbo在解析到<dubbo:service />时就会打开端口对外提供服务,有些服务需要一定的预热时间,比如初始化缓存,等待相关资源就位等,如果此时请求进来,则会报错。

    Dubbo-2.6.5 之前版本
    <dubbo:service delay="-1" />
    延迟到spring完成初始化之后。

    <dubbo:service delay="5000" />
    Spring初始化之后再延长5S。

    Dubbo-2.6.5 及以后版本
    这个版本之后,所有的服务都在Spring完成初始之后对外暴露,这是默认的。

    3、连接控制
    来自Provider端限制

    <dubbo:provider protocol="dubbo" accepts="10" />
    或者:

    <dubbo:protocol name="dubbo" accepts="10" />
    从文档上看,不知道这个配置是针对整个Provider,还是针对Provider中的每一个服务。也不知道是单个Consumer不超过10还是所有Consumer不超过10。

    来自客户端的限制:

    <dubbo:reference interface="com.foo.BarService" connections="10" />
    或者:

    <dubbo:service interface="com.foo.BarService" connections="10" />
    如果 <dubbo:service> 和 <dubbo:reference> 都配了 connections,<dubbo:reference> 优先,参见:配置的覆盖策略。

    官网这句话真让人搞不懂。dubbo:service是Provider端自己的限制,dubbo:reference是Consumer端自己的限制。双方各自限制自己可以使用的连接数。现在这两个不相干的东西可以覆盖,真搞不明白这个连接限制到底在限制谁。看文档越看越糊涂。5、

    4、延迟连接
    延迟连接用于减少长连接数。当有调用发起时,再创建长连接,只对长连接类型有效:

    <dubbo:protocol name="dubbo" lazy="true" />


    5、粘滞连接
    粘滞连接用于有状态服务,尽可能让Consumer连接相同的Provider,除非Provider挂掉。

    很明显在这种情况下,负载均衡策略将失效,并且粘滞连接将自动开启延迟连接,以减少长连接的个数。配置如下:

    <dubbo:reference id="xxxService" interface="com.xxx.XxxService" sticky="true" />
    沾滞连接可以精确到方法级别:

    <dubbo:reference id="xxxService" interface="com.xxx.XxxService">
    <dubbo:mothod name="sayHello" sticky="true" />
    </dubbo:reference>

    6、负载均衡(Load Balance)
    配置服务的客户端的 loadbalance 属性为 leastactive,此 Loadbalance 会调用并发数最小的 Provider(Consumer端并发数)。

    <dubbo:reference interface="com.foo.BarService" loadbalance="leastactive" />

    <dubbo:service interface="com.foo.BarService" loadbalance="leastactive" />

    作者:鲁班快跑

    出处:https://www.cnblogs.com/zhusf/p/15476008.html

    版权:本文版权归作者和博客园共有

    转载:您可以随意转载、摘录,但请在文章内注明作者和原文链接。

  • 相关阅读:
    spring之通过实例工厂方法配置Bean
    spring之通过静态工厂方法配置Bean
    spring之添加后置处理器的bean的生命周期
    spring之未加后置处理器的bean的生命周期
    TreeMap源码分析——基础分析(基于JDK1.6)
    HashMap源码分析(基于JDK1.6)
    left join 和 left outer join 的区别
    开发者必备的6款源码搜索引擎
    理想的技术面试过程
    一篇学习HTTP状态码的神文:我与依依的橙色岁月
  • 原文地址:https://www.cnblogs.com/zhusf/p/15476008.html
Copyright © 2011-2022 走看看