??云主机低折扣年付还赠送90天?? 广告位招租 - 15元/月全站展示
??伍彩集团官网直营彩票 ??言情小说??
??私有威屁恩(独享/安全/稳定/高速/低价) ??Google Facebook Youtube 科学上网
广告位招租 - 15元/月全站展示 广告位招租 - 15元/月全站展示
Dubbo 并发调优的几个参数

转载   JavaIT程序员   2018-11-15   浏览量:10


消费端调优:?

天天彩选四2018258:一、connections?

彩票开奖查询 www.kbyp.net 这个参数可以在服务提供端发布服务的时候配置,也可以在消费端引用服务的时候配置,但是这个值是只对消费端生效的,所以一般是服务提供端不建议配置,如果配置,请斟酌一下,详情请查看《对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连接的数量限制,而不是像上面两个参数对调用线程的配置。???

五,总结:

以上归纳出的几个参数建议服务端生效的在服务端配置,消费端生效的在消费端配置,不然会导致一些不可控的现象出现。这也叫改哪里的东西就应该在哪里,而不能乱放。

转载自://blog.51cto.com/13932491/2317525



深入理解分布式系统中的缓存架构 下
承接上一篇《理解分布式系统中的缓存架构(上)》,介绍了大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景,本文主要介绍缓存架构设计常见问题以及解决方案,业界案例。1分层缓存架构设计2缓存带来的复杂度问题常见的问题主要包括数据一致性缓存穿透缓存雪崩缓存高可用缓存热点下面逐一介绍分析这些问题以及相应的解决方案。数据一致性因为缓存属于持久化数据的一个副本,因此不可避免的会出现数据不一致问题。导致
使用反射对bean的collection属性赋值
反射对bean的collection属性赋值对collection使用反射创建时会遇到不知道具体实现类型而烦恼比如:classSchool{privateListclasses;//班级列表publicvoidsetClasses(Listclasses){this.classes=classes;}pulbicListgetClasses(){returnthisclasses;}}Class&
springcloud与dubbo的性能对比
在长期使用dubbo的团队中推行springcloud确实是个难题,巨大理由之一就是rpc调用效率远远高于http,故此做一个相关性能测试,所用到的dubbo与spring系均采用官方最新版(dubbo2.5.7、springboot1.5.9、springcloudedgware)。springcloud测试代码地址?https://github.com/liuchengts/
浅谈Spring cloud与Dubbo各自的优势与劣势
有关微服务架构的讨论最近一直很火。近期也看到一些分享SpringCloud的相关实施经验,这对于最近正在整理SpringCloud相关套件内容与实例应用的我而言,还是有不少激励的。目前,SpringCloud在国内的知名度并不高,与一些互联网公司的架构师、技术VP或者CTO在交流时,有些甚至还不知道该项目的存在。这也许与国内的开源服务治理框架Dubbo有一定的关系,除了Dubbo本身较为完善...
微服务 Dubbo + Zookeeper 原理解析
补充:2018-04-20值得一说的是:下方的“透明”是通过动态代理对“负载均衡和容错”的封装。此图配合下方案例代码可以更好的理解分布式服务框架-RPC原理。协议:说明:内容为小编个人见解,同时做备忘用基础准备:javaSocket,serverSocket,RPC协议。(1)网络通信数据传输靠的就是IO流(byte[]字...
基于springCloud的分布式架构体系
SpringCloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于SpringCloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:SpringCloud在微服务的架构中都做了哪些事情?SpringCloud提供的这些功能对微服务的架构提供了怎样的便利??我们先来简单回顾一下,我们以往互联网架构的发展情况:?传统架构发展史?
详细全面的 SpringBoot 文件上传
这些天忙着刷题,又怕遗忘了springboot,所以抽出一点时间折腾折腾,加深点印象。springboot的文件上传与springmvc的文件上传基本一致,只需注意一些配置即可?;肪骋螅篠pringBootv1.5.1.RELEASE+jdk1.7+myeclipse1).引入thymeleaf,支持页面跳转
静态方法中直接使用注入的bean对象
静态方法中直接使用注入的bean对象
依赖注入和控制反转的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转)、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对SpringIoc的理解。
聊聊阿里面试的三个层次!
最近去阿里的菜鸟国际做了一次面试交流,发现大公司对于面试者的知识结构考核非常严谨,可以作为我们日常工作学习的指导。虽然很多人说面试问到的东西在实际工作中很少用到,甚至有「面试造火箭,工作拧螺丝」的说法。但从面试中,其实可以看得出来现在的公司对于面试者的知识体系要求。如果我们能在工作中就按着这样的要求去不断提升,那么在面试的时候必然也能游刃有余。一般来说,阿里的面试会有两轮的技术电面,分别交叉检验你