`
lp895876294
  • 浏览: 284794 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

dubbo方法调用的timeout设置

    博客分类:
  • JAVA
 
阅读更多

参考dubbo用户手册,方法调用的默认超时时间为1s,但是具体的超时时间受限于服务端方法性能、服务端个数、客户端的并发数等因素,所以超时时间需要根据不同的场景进行调试。

基本步骤为:

  1. 测试服务端的TPS,单位为 任务数或线程个数/S,即每秒能够处理的任务数。TPS能够表示出每秒能够处理的任务个数。
  2. 根据客户端的并发量要求和服务端的服务能力设置超时时间。例如客户端并发量为R,单个服务端的服务能力为T,服务端的个数为N,那么超时时间 = R/(T*N) 。

具体调试步骤参考如下:

  • 使用多线程机制测试服务端接口的TPS。我使用单元测试进行的测试,UserTestInstance可以用作中使用的XXXService可以使用dubbo接口的服务注入,也可以注入服务端的服务。 
    package tps;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import tps.support.DubboFutureTask;
    import tps.support.DubboThread;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * Created by admin on 2015-12-27.
     */
    public class UserTestInstance {
    
        @Autowired
        private XXXService xxxService ;
    
        private static int num = 500 ;
    
        //默认使用和线程个数相同的线程池,避免线程等待的时间
        private ExecutorService executorService = Executors.newFixedThreadPool(num);
    
        //存储线程任务
        private List<DubboFutureTask> futureTasks = new ArrayList<>(num) ;
    
        private long startTime ;
    
        @Before
        public void startTime(){
            System.out.println() ;
            System.out.println("初始化调用线程。");
    
            for (int i=0 ; i<num ; i++){
                DubboThread dubboThread = new DubboThread() ;
                dubboThread.setXXXService(xxxService) ;
                dubboThread.setName("thread->"+(i+1));
                //创建异步任务
                DubboFutureTask futureTask = new DubboFutureTask(dubboThread) ;
    
                futureTasks.add(futureTask) ;
            }
            //创建完任务之后,开始计时
            startTime = System.currentTimeMillis() ;
        }
    
        @After
        public void endTime(){
            boolean flag = true ;
    
            while (flag){
                flag = false ;
                for (DubboFutureTask futureTask : futureTasks) {
                    //如果有一个没完成,则继续执行
                    if(!futureTask.isDone()){
                        flag = true ;
                        break ;
                    }
                }
            }
    
            //等待所有任务完成之后,停止计时
            double consumeTime = (System.currentTimeMillis() - startTime)/1000.0 ;
    
            System.out.println("线程数:"+futureTasks.size()+" , 共消耗时间:"+consumeTime+"s" +" , 异常数量:"+DubboThread.TIMEOUT_NUM.get());
    
            System.out.println("TPS:"+num/consumeTime);
        }
    
        @Test
        public void testTPS(){
            //提交任务请求到线程池
            for (DubboFutureTask futureTask : futureTasks) {
                executorService.submit(futureTask) ;
            }
    
        }
    }
    
     
    package tps.support;
    
    import lombok.Getter;
    import lombok.Setter;
    
    import java.util.concurrent.FutureTask;
    
    /**
     * Created by admin on 2015-12-27.
     */
    @Setter
    @Getter
    public class DubboFutureTask extends FutureTask<Object> {
    
        private DubboThread dubboThread ;
    
        public DubboFutureTask(DubboThread dubboThread) {
            super(dubboThread) ;
            this.dubboThread = dubboThread ;
        }
    }
    
     
    package tps.support;
    
    import com.glodon.framework.common.util.JsonMapper;
    import lombok.Getter;
    import lombok.Setter;
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.atomic.AtomicInteger;
    
    /**
     * Created by admin on 2015-12-21.
     */
    @Setter
    @Getter
    public class DubboThread implements Callable<Object> {
    
        public static final AtomicInteger TIMEOUT_NUM = new AtomicInteger(0) ;
    
        private XXXService xxxService ;
    
        private String name ;
    
        @Override
        public Object call() throws Exception {
            XXXEntity xxx = null ;
            try {
                xxx= xxxService.login("superman" , "123456") ;
                System.out.println("线程名称-> "+getName()+" -> "+ JsonMapper.toJSONString(xxx));
            }catch (Exception e){
                //异常数量
                TIMEOUT_NUM.incrementAndGet() ;
                e.printStackTrace();
            }
    
            return xxx ;
        }
    }
    
     
  • 根据服务端性能、个数和客户端的并发要求,就可以计算出具体的timeout的值了。

注:

  • dubbo用户手册 : http://dubbo.io/User+Guide-zh.htm 
分享到:
评论

相关推荐

    第四课:Dubbo调用模块详解1

    1. **超时控制**:通过设置`timeout`属性来限制调用的最大等待时间,防止长时间阻塞。 2. **服务版本管理**:通过`version`属性对服务版本进行控制,确保调用到正确版本的服务。 3. **分组策略**:`group`属性可以将...

    SpringBoot2.0 整合 Dubbo框架实现RPC服务远程调用方法

    connection-timeout: 5000ms spring: application: name: block-dubbo-provider dubbo: application: name: block-dubbo-provider registry: address: 127.0.0.1:2181 protocol: zookeeper protocol: name:...

    分布式RPC框架Apache Dubbo

    例如,`dubbo.protocol.name`用于指定服务暴露的协议,`dubbo.consumer.timeout`设置请求超时时间,`dubbo.consumer.retries`设定失败重试次数。 总结,Apache Dubbo通过Zookeeper作为服务注册与发现的工具,提供了...

    系统稳定性——Dubbo 常见错误及解决方法1

    2. **调用超时:client-side timeout** 超时可能由服务响应慢、客户端负载过高导致。对于服务端响应慢,可以通过`jstack`分析线程状态找出性能瓶颈,必要时调整timeout阈值。如果发现GC日志中有长时间的GC暂停,应...

    dubbo+zookeeper demo

    &lt;dubbo:service timeout="5000" retries="0" /&gt; ``` 此外,Dubbo还提供了丰富的监控功能,如监控中心、统计分析、日志记录等,可以帮助我们更好地管理和优化服务。 总结,通过以上步骤,我们成功地在SpringBoot...

    dubbo的.xsd文件分享

    接着,`dubbo.xsd`中的`&lt;dubbo:reference&gt;`元素则用于声明服务消费者,它包含了与`&lt;dubbo:service&gt;`类似的属性,但更多的是消费者端的配置,如timeout、retries、loadbalance等,这些参数直接影响到服务调用的性能和...

    Dubbo手册.pdf

    1) timeout:方法调用超时时间 2) retries:失败重试次数,默认2次 3) loadbalance:负载均衡算法,默认随机 4) actives:消费者端最大并发调用限制 【Dubbo启动时依赖服务不可用会怎样?】 默认情况下,Dubbo在...

    DUBBO注解最简单DEMO

    `@Reference`同样可以配置多个参数,如version、group、interface、timeout等,以匹配服务提供者的设置。 在Maven项目中,`pom.xml`文件会定义DUBBO的相关依赖,如dubbo、zookeeper等,这些都是DUBBO服务治理的基础...

    dubbo.xsd资源

    service&gt;、&lt;dubbo:reference&gt;、&lt;dubbo:application&gt;、&lt;dubbo:registry&gt;等配置元素,以及各个元素下的属性,如interface、version、group、timeout、retries等,这些都是编写正确Dubbo配置文件的关键。 8. **服务...

    dubbo+zookeeper 客户端所需jar包

    &lt;dubbo:consumer timeout="3000" check="false" /&gt; &lt;dubbo:reference id="myService" interface="com.example.MyService" version="1.0.0" /&gt; ``` 这里的`&lt;dubbo:registry&gt;`指定了Zookeeper的地址,`&lt;dubbo:...

    Apache Dubbo:Dubbo服务治理:服务熔断与超时重试

    dubbo.consumer.circuit-breaker.timeout=10000 # 请求量阈值,在一定时间内,达到此阈值的请求后,熔断器开始计算失败率 dubbo.consumer.circuit-breaker.request-volume-threshold=20 # 熔断器打开后,等待的时间...

    dubbo的xsd文件

    在这个例子中,`interface`指定了服务的接口全限定名,`version`是服务版本,`ref`是服务实现的Bean引用,`timeout`参数定义了服务调用的超时时间。 此外,Dubbo的XSD文件还支持扩展,这意味着可以通过自定义标签来...

    dubbo-admin 管理

    dubbo.consumer.timeout=3000 ``` 4. **其他高级配置**:还可以根据实际需求调整日志级别、监控中心地址、线程池大小等参数。 正确配置完成后,只需启动Dubbo-Admin,便可以在Web界面中看到注册中心中的所有服务...

    dubbo.xsd分布式dubbo的约束文件

    `dubbo.xsd`定义了`reference`元素来表示消费者,其中的`timeout`、`retries`等属性可以控制消费者的调用行为。 3. **注册中心(Registry)配置**: 注册中心是Dubbo服务发现的关键,`dubbo.xsd`定义了`registry`...

    DUBBO 中文帮助文档

    开发者可以设置 `Timeout` 属性来控制调用超时时间,以及通过 `Retries` 设置失败重试次数。这些参数对于优化服务性能和稳定性至关重要。 七、容错策略 Dubbo 提供了多种容错策略,如失败快速失败(FailsFast)、...

    Dubbo使用示例

    例如,可以通过`timeout`属性设置服务调用的超时时间,通过`retries`控制重试次数,通过`failfast`、`fallback`或`failsafe`策略应对失败情况。 总的来说,Dubbo作为一个强大的RPC框架,不仅简化了分布式服务的开发...

    Dubbo(四)------Dubbo入门示例(基于属性配置)

    &lt;dubbo:method name="sayHello" timeout="3000"/&gt; &lt;/dubbo:service&gt; ``` 这里,`demoService`是服务实现的Bean,`DemoService`是接口,`ref`属性指定服务实现,`protocol`定义了通信协议(默认为dubbo),`version...

    dubbo registry

    - registry.timeout:设置注册中心操作的超时时间,单位为毫秒。 - registry.group:注册中心的分组,用于区分不同的服务治理组件。 五、Dubbo Registry的高级特性 1. 服务分组:通过group属性,可以将相同业务的...

    Dubbo框架RPC实现原理

    配置项例如超时时间(timeout)和重试次数(retries)可以在服务提供方设置,并且服务消费者在调用时可以覆盖这些默认值: ```xml &lt;dubbo:service interface=...

Global site tag (gtag.js) - Google Analytics