`
fancyboy2050
  • 浏览: 240969 次
  • 性别: Icon_minigender_1
  • 来自: 皇城根儿下
社区版块
存档分类
最新评论

hessian服务压力测试

阅读更多
需求:现在的系统有一部分业务是通过hessian的远程服务提供的,为了应对不断的增长的服务器压力,需要对这个提供hessian服务的工程能承受的压力有一个比较详细的了解。

hessian走的http的协议,但是其数据传输跟一般用户发起的http服务还是不一样的,做压力的测试的开源工具还是比较多的,类似jemeter,LoadRunner等都可以,但是这些都没法对hessian服务进行压力测试。

方案1:创建一个web工程,在web工程提供一些http的服务,每个服务会对应的发起一个hessian请求,然后使用某些压力测试工具对这些http进行并发访问。
方案2:自己写java程序,模拟压力测试,然后逐个测试hessian服务。

方案一就不多说了,创建web工程,压力测试我们用的apache的ab test。

方案二:
我的想法是一次性创建X个线程模拟X个并发,然后每个线程循环Y次,每次发起一个hessian的请求,每次执行一次hessian请求,我会创建一个对象收集信息;然后创建一个监控线程,监控这些线程是否都执行完了,如果执行完了就对收集到的数据进行分析。

信息收集对象:
public class StopWatch {
	
	private long startTime;
	private long endTime;
// 一次hessian请求耗时
	private long elapsedTime;
//成功失败
	private boolean status;
	
	public StopWatch(){
		this.startTime = 0L;
		this.endTime = 0L;
		this.elapsedTime = 0L;
		this.status = false;
	}
	
	public long getStartTime() {
		return startTime;
	}
	public void setStartTime(long startTime) {
		this.startTime = startTime;
	}
	public long getEndTime() {
		return endTime;
	}
	public void setEndTime(long endTime) {
		this.endTime = endTime;
	}
	public boolean isStatus() {
		return status;
	}
	public void setStatus(boolean status) {
		this.status = status;
	}
	public long getElapsedTime() {
		return elapsedTime;
	}
	public void setElapsedTime(long elapsedTime) {
		this.elapsedTime = elapsedTime;
	}

}


压力测试主程序:
public class StressTest {
	
	private final static String url1 = "XXXXXXX";
	
	public static void main(String args[]) throws Throwable{
		
		HessianProxyFactory hpf = new HessianProxyFactory();
		hpf.setChunkedPost(false);
		final UserManagerRemote userManagerRemote = (UserManagerRemote)hpf.create(url1);

// 创建收集信息list
		final List<StopWatch> list = new ArrayList<StopWatch>(10000);
//线程数量
		int count = 150;	
		final long start1 = System.currentTimeMillis();
//创建循环栅栏,第一版我是创建了一个监控线程
		final CyclicBarrier barrier = new CyclicBarrier(count, new Runnable(){
				@Override
				public void run() {
					long end1 = System.currentTimeMillis();
//分析收集到的信息
					analyseStopWatch(list, (end1-start1));
				}
			}
		);
		for(int i=0; i<count; i++){
			Thread t = new Thread(
				new Runnable(){
					@Override
					public void run() {
						for(int j=0; j<100; j++){
//创建收集信息对象
							StopWatch sw = new StopWatch();
							long startTime = System.currentTimeMillis();
							sw.setStartTime(startTime);
							try {
								userManagerRemote.get(****L);
								sw.setStatus(true);
							} catch (Throwable e) {
								sw.setStatus(false);
							}
							long endTime = System.currentTimeMillis();
							sw.setEndTime(endTime);
							sw.setElapsedTime(endTime-startTime);
//将收集信息对象添加到list中
							list.add(sw);
						}
						try {
							barrier.await();
						} catch (InterruptedException e) {
							e.printStackTrace();
						} catch (BrokenBarrierException e) {
							e.printStackTrace();
						}
					}
					
				}
			);
			if(i < 29){
				t.setDaemon(true);
			}
			t.start();
		}
		
	}
	
	private static void analyseStopWatch(List<StopWatch> stopWatchs, long totalSpend){
		
		System.out.println("size = "+stopWatchs.size());
		Collections.sort(stopWatchs, new Comparator<StopWatch>(){
			@Override
			public int compare(StopWatch o1, StopWatch o2) {
				Long elapsedTime1 = o1.getElapsedTime();
				Long elapsedTime2 = o2.getElapsedTime();
				return elapsedTime1.compareTo(elapsedTime2);
			}
		});
		int size = stopWatchs.size();
		long min = 0;
		for(StopWatch sw : stopWatchs){
			if(sw.getElapsedTime() > 0){
				min = sw.getElapsedTime();
				break;
			}
		}
		System.out.println("spend time min = "+min+"MS   |   max = "+stopWatchs.get(size-1).getElapsedTime()+"MS");
		int failCount = 0;
		long spendTime = 0L;
		for(StopWatch sw : stopWatchs){
			spendTime +=sw.getElapsedTime();
			if(!sw.isStatus()){
				failCount += 1;
			}
		}
		System.out.println("total spend time = "+totalSpend+"MS");
		System.out.println("total request count = "+size);
		double d1 = totalSpend;
		double d2 = size;
		double averageST = d1/d2;
		System.out.println("average spend time = "+spendTime/size+"MS");
		System.out.println("Transaction Per Second = "+(1000/averageST));
		System.out.println("total fail count = "+failCount);
	}

}
分享到:
评论

相关推荐

    hessianServer

    在实际部署前,需要对Hessian服务进行充分的测试,包括单元测试、集成测试和压力测试,确保服务的稳定性和性能满足需求。 总结来说,HessianServer是利用Hessian协议构建的高效服务端程序,它简化了分布式系统中的...

    家乐宝技术干货分享-接口测试与性能测试.pptx

    Jmeter 是一个功能强大且广泛应用的测试工具,可以用于接口测试、压力测试、负载测试等多种场景。 测试过程 测试过程包括查看测试返回结果、断言的使用等多个方面。断言是期望值与实际结果是否一致的判断,可以...

    hession文档(与spring兼容)

    在实际使用中,为了保证服务的稳定性和可靠性,建议定期对Hession服务进行压力测试,了解其性能瓶颈,并根据测试结果进行优化。 通过以上介绍,我们可以看出Hession作为一个高效的RPC框架,在Spring生态中的应用...

    dubbo入门实例及性能测试

    - **基准测试工具**:可以使用Apache JMeter、LoadRunner等工具模拟大量并发请求,对服务进行压力测试。 - **测试指标**:关注响应时间、吞吐量、并发处理能力等关键性能指标。 - **非Dubbo(在同一JVM内运行)...

    Apache Dubbo 的 Apache JMeter 插件 介绍

    而Apache JMeter则是一款强大且广泛应用的性能测试工具,用于模拟大量并发用户对系统进行压力测试,确保系统在高负载下的稳定性和性能。 Apache JMeter的Dubbo插件是为了将JMeter的功能扩展到对Dubbo接口的性能测试...

    GroupCo基础服务提供者,java版本.可以与GroupCo服务层无缝切换

    而熔断和降级策略则是为了在系统压力过大时保护服务,防止整个系统的崩溃。 文件名称"java-groupco-rpc-master"暗示了这是一个基于RPC(Remote Procedure Call,远程过程调用)的项目,RPC使得服务间的通信就像调用...

    Dubbo分布式服务框架

    - **服务测试**:对服务提供者进行压力测试,确保服务的稳定性和性能。 【框架设计原则】: - **模块化**:将复杂系统分解为可复用的模块,降低耦合度。 - **扩展性**:设计时考虑到未来可能的需求变化,预留扩展点...

    基于netty轻量的高性能分布式RPC服务框架.zip

    对构建的RPC框架进行压力测试,评估性能瓶颈,可能的优化点包括缓存策略、线程池配置、序列化算法选择等。 在"java0323"这个文件夹中,可能会包含实现这些概念的源代码,例如服务提供者和服务消费者的相关类、...

    taobao DUBBO服务框架1

    在服务调用过程中,DUBBO提供了多种负载均衡策略,如轮询、随机、最少活跃调用数等,以优化服务的访问分布,减轻单个节点的压力。同时,DUBBO内置的故障转移和重试机制能确保服务的高可用性,即使在部分服务节点出现...

    dubboDemo新手教学

    - 运行测试,验证服务调用是否正常。 通过这个简单的"DubboDemo"教学,你可以了解到如何搭建一个基本的Dubbo服务架构,理解服务提供与消费的过程,以及服务治理的基本概念。随着对Dubbo深入学习,你将能够构建更...

    Dubbo学习文档

    并通过模拟压力测试等方式来进行系统容量评估。 - **服务授权与黑白名单**:提供细粒度的服务访问控制,可以通过设置黑白名单来限制某些客户端对特定服务的访问权限。 - **服务SLA与流程管理**:定义服务级别协议...

    guide-rpc-framework-master.zip

    这可能包括单元测试、集成测试、压力测试等,以及针对网络延迟、吞吐量和内存占用的性能调优。 通过研究"guide-rpc-framework-master"项目,我们可以获得宝贵的实践经验,提升对RPC框架的理解,为自己的分布式系统...

    dubbo手册中文版

    在消费者调用多个服务提供者时,Dubbo提供了多种负载均衡策略,如轮询、随机、最少活跃调用数等,以优化服务请求的分布,减少单个服务提供者的压力。 4. **服务治理**: Dubbo提供服务治理功能,包括服务的元数据...

    Dubbo面试及答案(上).pdf

    5. **hessian**:集成Hessian服务,通过HTTP通讯,使用Servlet暴露服务,与Hessian服务兼容。它有多个短连接,同步HTTP传输,适合传递较大参数,但会增加提供者的压力,也可传文件。 6. **memcache**:基于...

    dubbo代码以及开发资料

    开发过程中,你需要了解如何创建服务提供者和服务消费者,配置服务接口和实现,设置注册中心,选择合适的协议和负载均衡策略,以及如何进行服务测试和调优。 9. **Spring整合Dubbo** 大多数情况下,Dubbo会与...

    Dubbo RPC框架原理解析和源码

    这些策略在服务消费者请求服务提供者时,动态选择一个合适的实例进行调用,有效地分散了服务压力。 **五、服务过滤器和服务拦截器** 服务过滤器允许在服务调用前后插入自定义逻辑,如日志记录、权限验证等。服务...

    dubbo-user-book

    随后,文档指出了在大规模服务化之前的传统方法中,通过简单的RMI、Hessian等工具暴露和引用远程服务时,服务URL配置管理困难以及对F5等硬件负载均衡器依赖过大,导致的单点压力增大的问题。为解决这些问题,需要...

    dubbo用户指南

    负载均衡则需要处理多个服务提供者之间的调用请求分配,保证服务提供者的压力均衡。而线程模型是指服务在处理请求时所采用的线程策略。 除了基本的服务调用和配置,Dubbo用户指南还介绍了服务分组、多版本、参数...

    Dubbox+Redis3.0+Spring+Hibernate+zookeeper实现消息推送核心搭建

    5. **系统测试**:在开发过程中,进行单元测试、集成测试以及压力测试,确保系统的稳定性和效率。 通过上述组件的组合,我们可以构建一个高效、可扩展的消息推送系统,为用户提供实时的信息通知,同时保证系统的...

    JAVA面试_Dubbo常问面试题30个.pdf

    - 同步HTTP传输,Hessian序列化,适用于参数较大的情况,提供者压力较大,可传递文件。 6. **memcache协议**和**redis协议**: - 分别基于memcached和redis实现的RPC协议,适用于缓存服务的调用。 【Dubbo超时...

Global site tag (gtag.js) - Google Analytics