消费端调优:
一、connections (连接数控制)
这个参数可以在服务提供端发布服务的时候配置,也可以在消费端引用服务的时候配置,但是这个值是只对消费端生效的,所以一般是服务提供端不建议配置,如果配置,请斟酌一下,详情请查看《对connections参数的设置 》。不管是在消费端或者服务提供端,如果对某个服务配置了connections参数,并且该参数大于1,那么就会导致消费端在创建该服务的远程socketclient的时候(如果是dubbo协议的话)将会给该服务初始化一个私有的socketclient。所以一般不建议对这个值进行调整。
服务端优化调整:
相对余消费端,服务端调优的参数相对多一些,但是配置的时候也需要谨慎。
一、executes (并发数控制)
这个参数是可以精确到方法级别的参数,就是可以指定调用远程接口某个方法的是该参数的值。具体是怎么配置的可以到官方文档里面去看看那,这里只是描述这个参数实际意义以及使用的时候应该注意点。
要说这个参数,就要所介绍ExecuteLimitFilter,他是这个参数使用者,看到Filter大家就应该懂了,就是在每个方法请求前后加上业务逻辑。下面贴出里面的代码:
@Activate(group = Constants.PROVIDER, value = Constants.EXECUTES_KEY)
public class ExecuteLimitFilter implements Filter {
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
URL url = invoker.getUrl();
String methodName = invocation.getMethodName();
int max = url.getMethodParameter(methodName, Constants.EXECUTES_KEY, 0);
if (max > 0) {
RpcStatus count = RpcStatus.getStatus(url, invocation.getMethodName());
if (count.getActive() >= max) {
throw new RpcException("Failed to invoke method " + invocation.getMethodName() + " in provider " + url + ", cause: The service using threads greater than <dubbo:service executes=\"" + max + "\" /> limited.");
}
}
long begin = System.currentTimeMillis();
boolean isException = false;
RpcStatus.beginCount(url, methodName);
try {
Result result = invoker.invoke(invocation);
return result;
} catch (Throwable t) {
isException = true;
if(t instanceof RuntimeException) {
throw (RuntimeException) t;
}
else {
throw new RpcException("unexpected exception when ExecuteLimitFilter", t);
}
}
finally {
RpcStatus.endCount(url, methodName, System.currentTimeMillis() - begin, isException);
}
}
}
上面这段代码主要是看两个地方,分别是第7行和第10行,第7行是获取配置的executes的值,是一个int类型的,描述数量,然后第10行是获取当前请求方法当前的状态,里面既有一个active属性(该属性是AtomacInteger类型的,大家应该懂了为什么用这个类型),表示当前请求的方法处于执行状态的线程数量,如果这个值大于或者等于配置的值那么直接抛出异常,那么消费端就会收到一个RPC的异常导致调用服务失败,这是这个参数最终导致的效果。
二、actives
这个参数基本上和excetes一样,但是有一点不同,在说这不同之前,还是看看另一个Filter,看名字你们应该就知道它是做什么的了—— ActiveLimitFilter,下面同样贴出代码:
@Activate(group = Constants.CONSUMER, value = Constants.ACTIVES_KEY)
public class ActiveLimitFilter implements Filter {
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
URL url = invoker.getUrl();
String methodName = invocation.getMethodName();
int max = invoker.getUrl().getMethodParameter(methodName, Constants.ACTIVES_KEY, 0);
RpcStatus count = RpcStatus.getStatus(invoker.getUrl(), invocation.getMethodName());
if (max > 0) {
long timeout = invoker.getUrl().getMethodParameter(invocation.getMethodName(), Constants.TIMEOUT_KEY, 0);
long start = System.currentTimeMillis();
long remain = timeout;
int active = count.getActive();
if (active >= max) {
synchronized (count) {
while ((active = count.getActive()) >= max) {
try {
count.wait(remain);
} catch (InterruptedException e) {
}
long elapsed = System.currentTimeMillis() - start;
remain = timeout - elapsed;
if (remain <= 0) {
throw new RpcException("Waiting concurrent invoke timeout in client-side for service: "
+ invoker.getInterface().getName() + ", method: "
+ invocation.getMethodName() + ", elapsed: " + elapsed
+ ", timeout: " + timeout + ". concurrent invokes: " + active
+ ". max concurrent invoke limit: " + max);
}
}
}
}
}
try {
long begin = System.currentTimeMillis();
RpcStatus.beginCount(url, methodName);
try {
Result result = invoker.invoke(invocation);
RpcStatus.endCount(url, methodName, System.currentTimeMillis() - begin, true);
return result;
} catch (RuntimeException t) {
RpcStatus.endCount(url, methodName, System.currentTimeMillis() - begin, false);
throw t;
}
} finally {
if(max>0){
synchronized (count) {
count.notify();
}
}
}
}
}
上面代码大致上和executes一样,唯一不同的就是多了一个等待时间,当当前执行该方法的线程超出了最大限制,那么可以等待一个timeout时间,如果时间过了还是超出了最大限制,那么就抛出异常。这个相对余executes来说温柔那么点。这就是那点不同!
三、accepts
在看代码之前先看看这个参数的意思,这个参数是告知服务提供端能接收多少个消费端连接该服务提供方。下面接着上代码,这个参数的体现是在类AbstractServer中。代码如下:
要说这个参数,就要所介绍ExecuteLimitFilter,他是这个参数使用者,看到Filter大家就应该懂了,就是在每个方法请求前后加上业务逻辑。下面贴出里面的代码:
@Override
public void connected(Channel ch) throws RemotingException {
Collection<Channel> channels = getChannels();
if (accepts > 0 && channels.size() > accepts) {
logger.error("Close channel " + ch + ", cause: The server " + ch.getLocalAddress() + " connections greater than max config " + accepts);
ch.close();
return;
}
super.connected(ch);
}
这个方法是每个消费端向服务提供端创建一个socket连接的时候都会触发,上面可以清晰看到如果连接当前服务端的消费端数量超出了配置的值,那么将会关闭当前消费端连接的请求。这个只是对socket连接的数量限制,而不是像上面两个参数对调用线程的配置。
以上归纳出的几个参数建议服务端生效的在服务端配置,消费端生效的在消费端配置,不然会导致一些不可控的现象出现。这也叫改哪里的东西就应该在哪里,而不能乱放。
相关推荐
通常这样的博客可能会涵盖以下几个方面的知识点: 1. **Dubbo测试环境搭建**:讲解如何配置Dubbo服务提供者和服务消费者,包括Maven或Gradle构建文件的设置,以及Spring或Spring Boot应用中Dubbo的配置。 2. **...
在Java性能调优领域,有以下几个核心知识点: 1. **JVM调优**:Java虚拟机(JVM)是Java程序运行的基础,其性能直接影响应用的响应速度和稳定性。书中会深入讲解JVM内存模型,包括堆内存、栈内存、方法区等,以及...
Dubbo 的核心框架原理主要包括以下几个部分: 1. **服务注册与发现**:Dubbo 提供 ZooKeeper 等多种注册中心支持,服务提供者在启动时向注册中心注册自己的服务,服务消费者则从注册中心获取服务提供者的地址列表。...
Dubbo框架的技术原理主要体现在以下几个方面:首先,它采用了远程过程调用(RPC)机制,实现跨网络的分布式调用;其次,它支持多种网络通信协议,如HTTP、TCP等,增加了调用方式的灵活性;再次,Dubbo框架还具有负载...
在 ZooKeeper 的配置中,主要涉及以下几个关键文件: 1. `conf/zoo.cfg`:这是 ZooKeeper 的主配置文件,包含了服务器端的配置信息,如数据目录(dataDir)、日志目录(dataLogDir)、客户端连接端口(clientPort)...
在具体的实现上,我们可以看到以下几个关键点: 1. **服务定义**:每个店铺的服务需要定义为Dubbo服务,包括接口、实现类和服务配置,以便于服务的暴露和引用。 2. **注册中心**:系统可能使用Zookeeper或其他注册...
为了提高ZooKeeper的性能和可靠性,可以从以下几个方面入手: - **合理选择部署模式**:根据实际应用场景选择合适的部署模式,比如单机模式、伪集群模式或完全分布式模式。 - **优化网络配置**:减少网络延迟,增加...
根据给定的文件信息,我们可以提炼出以下几个关键的知识点: ### 一、架构师的角色与职责 架构师在软件开发过程中扮演着至关重要的角色。他们不仅需要具备深厚的技术背景,还需要有良好的沟通能力和团队协作精神。...
在Java面试中,以下几个方面通常是考察的重点: 1. **基础知识**:包括Java语法、面向对象设计原则(如封装、继承、多态)、异常处理、集合框架(ArrayList、LinkedList、HashMap、HashSet等)和内部类等。理解这些...
Java面试中,BATJ(百度、阿里巴巴、腾讯、京东)等大厂常常关注以下几个方面: 1. **Java多线程**: - **线程池原理**:线程池通过复用已存在的线程来提高性能,避免频繁创建和销毁线程带来的开销。它可以管理...
根据提供的简历模板内容,我们可以提炼出以下几个重要的IT知识点: ### 一、个人基本信息与联系方式 在简历中,求职者提供了自己的基本信息,包括联系方式(电话号码和电子邮箱)。这对于招聘方来说是非常重要的...
4. **数据封装与动态SQL**:MyBatis如何将SQL结果映射到对象,有哪几种映射方式(如Map映射,注解映射,XML映射),批量插入的实现,获取自动生成的主键值的方法,以及如何传递多个参数。动态SQL的用途、执行原理,...
在手册中,主要涵盖以下几个关键知识点: 1. **基本规范**:这部分包括命名规范、注释规范、代码格式等基础内容。例如,类名采用全大写字母的驼峰命名法,常量全大写,变量和方法遵循小驼峰命名规则。注释应清晰...
在Java技术论坛中,你可以找到各种各样的主题,包括但不限于以下几个关键领域: 1. **基础知识**:从Java语言的基础语法到面向对象编程的概念,如类、对象、封装、继承和多态等。这里还会讨论异常处理、垃圾回收...
在软件技术毕业论文中,Java相关的话题可能涵盖以下几个方面: 1. **Java基础**:你可以研究Java语法、类和对象、封装、继承、多态等面向对象特性,以及异常处理、IO流、集合框架等核心概念。 2. **Java并发编程**...
在Java领域,系统架构师的角色通常涵盖以下几个核心知识点: 1. **技术选型**:作为Java系统架构师,了解并选择适合项目的技术栈是基础。这包括决定使用哪种Java框架(如Spring Boot, Hibernate等)、数据库系统...
首先,"Java工程师修炼之道"可能会包括以下几个关键知识点: 1. **基础语法**:介绍Java的基本数据类型、变量、运算符、流程控制语句(如if、switch、for、while等),以及方法的定义和调用。 2. **类与对象**:...
【压缩包子文件的文件名称列表】2021面试大全.doc:这应该是压缩包内的主文档,详细列举了2021年的Java面试问题和解析,可能包括了以下几个关键知识点: 1. **Java基础**:包括Java语法、数据类型、运算符、流程...
【描述】:“面试成功 现在面试很大一部分都是考理论方面跟做几个小程序就行 所以考前看一下 对你进入公司帮助很大的” 从这个标题和描述中,我们可以提炼出一些关于Java面试的关键知识点,这些知识点对于准备微软...
这包括但不限于以下几个方面: 1. **基本语法**:包括变量、数据类型、运算符、流程控制(if-else,switch,for,while)、方法定义与调用等。 2. **面向对象**:封装、继承、多态是Java面向对象编程的三大特性,...