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

基本步骤为:

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

具体调试步骤参考如下:

  • 使用多线程机制测试服务端接口的TPS。我使用单元测试进行的测试,UserTestInstance可以用作中使用的XXXService可以使用dubbo接口的服务注入,也可以注入服务端的服务。

    1. package tps;
    2. import org.junit.After;
    3. import org.junit.Before;
    4. import org.junit.Test;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import tps.support.DubboFutureTask;
    7. import tps.support.DubboThread;
    8. import java.util.ArrayList;
    9. import java.util.List;
    10. import java.util.concurrent.ExecutorService;
    11. import java.util.concurrent.Executors;
    12. /**
    13. * Created by admin on 2015-12-27.
    14. */
    15. public class UserTestInstance {
    16. @Autowired
    17. private XXXService xxxService ;
    18. private static int num = 500 ;
    19. //默认使用和线程个数相同的线程池,避免线程等待的时间
    20. private ExecutorService executorService = Executors.newFixedThreadPool(num);
    21. //存储线程任务
    22. private List<DubboFutureTask> futureTasks = new ArrayList<>(num) ;
    23. private long startTime ;
    24. @Before
    25. public void startTime(){
    26. System.out.println() ;
    27. System.out.println("初始化调用线程。");
    28. for (int i=0 ; i<num ; i++){
    29. DubboThread dubboThread = new DubboThread() ;
    30. dubboThread.setXXXService(xxxService) ;
    31. dubboThread.setName("thread->"+(i+1));
    32. //创建异步任务
    33. DubboFutureTask futureTask = new DubboFutureTask(dubboThread) ;
    34. futureTasks.add(futureTask) ;
    35. }
    36. //创建完任务之后,开始计时
    37. startTime = System.currentTimeMillis() ;
    38. }
    39. @After
    40. public void endTime(){
    41. boolean flag = true ;
    42. while (flag){
    43. flag = false ;
    44. for (DubboFutureTask futureTask : futureTasks) {
    45. //如果有一个没完成,则继续执行
    46. if(!futureTask.isDone()){
    47. flag = true ;
    48. break ;
    49. }
    50. }
    51. }
    52. //等待所有任务完成之后,停止计时
    53. double consumeTime = (System.currentTimeMillis() - startTime)/1000.0 ;
    54. System.out.println("线程数:"+futureTasks.size()+" , 共消耗时间:"+consumeTime+"s" +" , 异常数量:"+DubboThread.TIMEOUT_NUM.get());
    55. System.out.println("TPS:"+num/consumeTime);
    56. }
    57. @Test
    58. public void testTPS(){
    59. //提交任务请求到线程池
    60. for (DubboFutureTask futureTask : futureTasks) {
    61. executorService.submit(futureTask) ;
    62. }
    63. }
    64. }

     

    1. package tps.support;
    2. import lombok.Getter;
    3. import lombok.Setter;
    4. import java.util.concurrent.FutureTask;
    5. /**
    6. * Created by admin on 2015-12-27.
    7. */
    8. @Setter
    9. @Getter
    10. public class DubboFutureTask extends FutureTask<Object> {
    11. private DubboThread dubboThread ;
    12. public DubboFutureTask(DubboThread dubboThread) {
    13. super(dubboThread) ;
    14. this.dubboThread = dubboThread ;
    15. }
    16. }

     

    1. package tps.support;
    2. import com.glodon.framework.common.util.JsonMapper;
    3. import lombok.Getter;
    4. import lombok.Setter;
    5. import java.util.concurrent.Callable;
    6. import java.util.concurrent.atomic.AtomicInteger;
    7. /**
    8. * Created by admin on 2015-12-21.
    9. */
    10. @Setter
    11. @Getter
    12. public class DubboThread implements Callable<Object> {
    13. public static final AtomicInteger TIMEOUT_NUM = new AtomicInteger(0) ;
    14. private XXXService xxxService ;
    15. private String name ;
    16. @Override
    17. public Object call() throws Exception {
    18. XXXEntity xxx = null ;
    19. try {
    20. xxx= xxxService.login("superman" , "123456") ;
    21. System.out.println("线程名称-> "+getName()+" -> "+ JsonMapper.toJSONString(xxx));
    22. }catch (Exception e){
    23. //异常数量
    24. TIMEOUT_NUM.incrementAndGet() ;
    25. e.printStackTrace();
    26. }
    27. return xxx ;
    28. }
    29. }

     

  • 根据服务端性能、个数和客户端的并发要求,就可以计算出具体的timeout的值了。
  • dubbo用户手册 : http://dubbo.io/User+Guide-zh.htm

dubbo方法调用的timeout设置的更多相关文章

  1. dubbo同步调用、异步调用和是否返回结果源码分析和实例

    0. dubbo同步调用.异步调用和是否返回结果配置 (1)dubbo默认为同步调用,并且有返回结果. (2)dubbo异步调用配置,设置 async="true",异步调用可以提 ...

  2. dubbo源码分析2-reference bean发起服务方法调用

    dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...

  3. pycharm 如何设置方法调用字体颜色

    一.pycharm 如何设置方法调用字体颜色 1.打开pycharm编辑器,file > settings > editor > color scheme > python & ...

  4. dubbo中拦截生产者或消费者服务方法调用

    比如当前有个需求,需要拦截dubbo的服务提供方或者服务消费方的方法,判断参数中是否包含某个关键字进行拦截阻止执行,那么我们可以通过使用dubbo的SPI机制通过实现Filter类来拦截,话不多说直接 ...

  5. 9.4 dubbo异步调用原理

    9.1 客户端发起请求源码.9.2 服务端接收请求消息并发送响应消息源码.9.3 客户端接收响应信息(异步转同步的实现) 分析了dubbo同步调用的源码,现在来看一下dubbo异步调用. 一.使用方式 ...

  6. Dubbo——服务调用过程

    文章目录 引言 服务的交互 服务降级 集群容错 服务调用 服务端接收请求 总结 引言 经过之前文章的铺垫,现在可以来分析服务的交互调用过程了. 服务的交互 服务降级 从名字上看我们不难理解MockCl ...

  7. Dubbo服务调用过程源码解析④

    目录 0.服务的调用 1.发送请求 2.请求编码 3.请求的解码 4.调用具体服务 5.返回调用结果 6.接收调用结果 Dubbo SPI源码解析① Dubbo服务暴露源码解析② Dubbo服务引用源 ...

  8. dubbo+zookeeper+springBoot框架整合与dubbo泛型调用演示

    dubbo + zookeeper + spring Boot框架整合与dubbo泛型调用演示   By:客 授客 QQ:1033553122  欢迎加入全国软件测试交流 QQ  群:7156436 ...

  9. 限时购校验小工具&dubbo异步调用实现限

    本文来自网易云社区 作者:张伟 背景 限时购是网易考拉目前比较常用的促销形式,但是前期创建一个限时购活动时需要各个BU按照指定的Excel格式进行选品提报,为了保证提报数据准确,运营需要人肉校验很多信 ...

随机推荐

  1. eclipse中的project 和classpath文件的具体作用

    项目->右键 Properties-> java Build Path -> source: xxx/data xxx/src 体现在 .classpath文件中: .classpa ...

  2. centeros7的redis-cli命令不生效解决方法(亲测)

    如果你已经安装了redis服务器,并且已经启动,但是redis-cli命令无法生效,分析,命令未加入环境变量.那就给redis命令加入环境变量中: 注意点:redis安装目录会有不同,注意下面的PAT ...

  3. Android Studio查找功能(搜索功能)

    F3 向下查找关键字出现位置 Shift+F3 向上一个关键字出现位置 2.在当前工程内查找文本[Ctrl+Shift+F] 先会弹出一个对话框,直接点击[find],开始在整个工程内查找该字符串   ...

  4. CodeForces 672B Different is Good

    链接:http://codeforces.com/problemset/problem/672/B 本文链接:http://www.cnblogs.com/Ash-ly/p/5491176.html ...

  5. 10、Flask实战第10天:视图使用装饰器

    在实际开发中,我们有时候会用到自己定义装饰器并应用到函数视图或者类视图里面:比如:我们要想进入个人中心页面,首先要验证你是否登录,否则进不去,下面我们来模拟这个场景 定义一个装饰器 from func ...

  6. ( 转 ) mysql 实战 or、in与union all 的查询效率

    OR.in和union all 查询效率到底哪个快. 网上很多的声音都是说union all 快于 or.in,因为or.in会导致全表扫描,他们给出了很多的实例. 但真的union all真的快于o ...

  7. [Baltic2003] Gem

    [Baltic2003]Gem Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 501  Solved: 320[Submit][Status][Discu ...

  8. 【MySQL笔记】mysql报错"ERROR 1206 (HY000): The total number of locks exceeds the lock table size"的解决方法

    step1:查看 1.1 Mysql命令行里输入"show engines:"查看innoddb数据引擎状态, 1.2 show variables "%_buffer% ...

  9. Java高级架构师(一)第12节:Service的实现以及模块化

    BaseService.java package com.sishuok.architecture1.common.service; import java.util.List; import com ...

  10. Scala实战高手****第8课:零基础实战Scala最常用数据结构Map和Tuple及Spark源码鉴赏

    本课内容1.Map和Tuple在Spark源码中的鉴赏2.Map和Tuple代码操作实战 ------------------------------------------------------- ...