dubbo方法调用的timeout设置
方法调用的默认超时时间为1s,但是具体的超时时间受限于服务端方法性能、服务端个数、客户端的并发数等因素,所以超时时间需要根据不同的场景进行调试。
基本步骤为:
- 测试服务端的TPS,单位为 任务数或线程个数/S,即每秒能够处理的任务数。TPS能够表示出每秒能够处理的任务个数。
- 根据客户端的并发量要求和服务端的服务能力设置超时时间。例如客户端并发量为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方法调用的timeout设置的更多相关文章
- dubbo同步调用、异步调用和是否返回结果源码分析和实例
0. dubbo同步调用.异步调用和是否返回结果配置 (1)dubbo默认为同步调用,并且有返回结果. (2)dubbo异步调用配置,设置 async="true",异步调用可以提 ...
- dubbo源码分析2-reference bean发起服务方法调用
dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...
- pycharm 如何设置方法调用字体颜色
一.pycharm 如何设置方法调用字体颜色 1.打开pycharm编辑器,file > settings > editor > color scheme > python & ...
- dubbo中拦截生产者或消费者服务方法调用
比如当前有个需求,需要拦截dubbo的服务提供方或者服务消费方的方法,判断参数中是否包含某个关键字进行拦截阻止执行,那么我们可以通过使用dubbo的SPI机制通过实现Filter类来拦截,话不多说直接 ...
- 9.4 dubbo异步调用原理
9.1 客户端发起请求源码.9.2 服务端接收请求消息并发送响应消息源码.9.3 客户端接收响应信息(异步转同步的实现) 分析了dubbo同步调用的源码,现在来看一下dubbo异步调用. 一.使用方式 ...
- Dubbo——服务调用过程
文章目录 引言 服务的交互 服务降级 集群容错 服务调用 服务端接收请求 总结 引言 经过之前文章的铺垫,现在可以来分析服务的交互调用过程了. 服务的交互 服务降级 从名字上看我们不难理解MockCl ...
- Dubbo服务调用过程源码解析④
目录 0.服务的调用 1.发送请求 2.请求编码 3.请求的解码 4.调用具体服务 5.返回调用结果 6.接收调用结果 Dubbo SPI源码解析① Dubbo服务暴露源码解析② Dubbo服务引用源 ...
- dubbo+zookeeper+springBoot框架整合与dubbo泛型调用演示
dubbo + zookeeper + spring Boot框架整合与dubbo泛型调用演示 By:客 授客 QQ:1033553122 欢迎加入全国软件测试交流 QQ 群:7156436 ...
- 限时购校验小工具&dubbo异步调用实现限
本文来自网易云社区 作者:张伟 背景 限时购是网易考拉目前比较常用的促销形式,但是前期创建一个限时购活动时需要各个BU按照指定的Excel格式进行选品提报,为了保证提报数据准确,运营需要人肉校验很多信 ...
随机推荐
- 【乱入】Uva11021麻球繁衍
就是根据概率公式入门算算. #include<bits/stdc++.h> ; int n,m,k; double p[N],f[N]; int main(){ int T;scanf(& ...
- html怎样让表格里面的内容居中
html怎样让表格里面的内容居中 text-align:center; 在表格td中,有两个属性控制居中显示 align——表示左右居中——left,center,right valign——控制上下 ...
- [ Python - 2 ] 常见内置函数
1. abs(): 绝对值 In [1]: abs(-10) Out[1]: 10 2. all(): 当参数中任何一个值为False时,all() 都为False all(iterable) ...
- 《Java编程思想》笔记 第十五章 泛型
1 泛型 “泛型”意思就是适用于许多类型. 使用泛型的目的之一: 指定容器持有什么类型,让编译器确保正确性,而不是在运行期发现错误. 这个容器可以看成是有其他类型对象作为成员的类,而不单单只是JDK中 ...
- 《Java编程思想》笔记 第三章 操作符
1.操作符种类: 运算顺序1-7 一元操作符(单目操作符) - 负号, + 正号,--递减,++递增 算术操作符 + - * / % 移位操作符 <<左移(低位补0),>&g ...
- 常用的LUA片段
生成TS的办法 local t=ngx.now(); local n=os.date(,); n=n..-string.len(n)); ngx.say(n); 产生101至200的所有素数 func ...
- 阿里云linux下修改mysql默认密码(xampp环境)- 原创
1.修改MySQL的登录设置: # vi /etc/my.cnf 在[mysqld]的段中加上一句:skip-grant-tables 例如: [mysqld] datadir=/var/lib/my ...
- [BZOJ1076][SCOI2008]奖励关 状压dp
1076: [SCOI2008]奖励关 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3070 Solved: 1595[Submit][Statu ...
- background-position 用法介绍
转自:http://blog.csdn.net/jeamking/article/details/5617088 语法: background-position : length || lengt ...
- 大数模板(Java)
大数加法 /* 给出2个大整数A,B,计算A+B的结果. Input 第1行:大数A 第2行:大数B (A,B的长度 <= 10000 需注意:A B有可能为负数) Output 输出A + B ...