Search in sources :

Example 1 with RpcStatus

use of org.apache.dubbo.rpc.RpcStatus in project dubbo by alibaba.

the class CountTelnetHandler method count.

private String count(Invoker<?> invoker, String method) {
    URL url = invoker.getUrl();
    List<List<String>> table = new ArrayList<List<String>>();
    List<String> header = new ArrayList<String>();
    header.add("method");
    header.add("total");
    header.add("failed");
    header.add("active");
    header.add("average");
    header.add("max");
    if (method == null || method.length() == 0) {
        for (Method m : invoker.getInterface().getMethods()) {
            RpcStatus count = RpcStatus.getStatus(url, m.getName());
            table.add(createRow(m.getName(), count));
        }
    } else {
        boolean found = false;
        for (Method m : invoker.getInterface().getMethods()) {
            if (m.getName().equals(method)) {
                found = true;
                break;
            }
        }
        if (found) {
            RpcStatus count = RpcStatus.getStatus(url, method);
            table.add(createRow(method, count));
        } else {
            return "No such method " + method + " in class " + invoker.getInterface().getName();
        }
    }
    return TelnetUtils.toTable(header, table);
}
Also used : ArrayList(java.util.ArrayList) ArrayList(java.util.ArrayList) List(java.util.List) Method(java.lang.reflect.Method) RpcStatus(org.apache.dubbo.rpc.RpcStatus) URL(org.apache.dubbo.common.URL)

Example 2 with RpcStatus

use of org.apache.dubbo.rpc.RpcStatus in project dubbo by alibaba.

the class ShortestResponseLoadBalance method doSelect.

@Override
protected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation) {
    // Number of invokers
    int length = invokers.size();
    // Estimated shortest response time of all invokers
    long shortestResponse = Long.MAX_VALUE;
    // The number of invokers having the same estimated shortest response time
    int shortestCount = 0;
    // The index of invokers having the same estimated shortest response time
    int[] shortestIndexes = new int[length];
    // the weight of every invokers
    int[] weights = new int[length];
    // The sum of the warmup weights of all the shortest response  invokers
    int totalWeight = 0;
    // The weight of the first shortest response invokers
    int firstWeight = 0;
    // Every shortest response invoker has the same weight value?
    boolean sameWeight = true;
    // Filter out all the shortest response invokers
    for (int i = 0; i < length; i++) {
        Invoker<T> invoker = invokers.get(i);
        RpcStatus rpcStatus = RpcStatus.getStatus(invoker.getUrl(), invocation.getMethodName());
        // Calculate the estimated response time from the product of active connections and succeeded average elapsed time.
        long succeededAverageElapsed = rpcStatus.getSucceededAverageElapsed();
        int active = rpcStatus.getActive() + 1;
        long estimateResponse = succeededAverageElapsed * active;
        int afterWarmup = getWeight(invoker, invocation);
        weights[i] = afterWarmup;
        // Same as LeastActiveLoadBalance
        if (estimateResponse < shortestResponse) {
            shortestResponse = estimateResponse;
            shortestCount = 1;
            shortestIndexes[0] = i;
            totalWeight = afterWarmup;
            firstWeight = afterWarmup;
            sameWeight = true;
        } else if (estimateResponse == shortestResponse) {
            shortestIndexes[shortestCount++] = i;
            totalWeight += afterWarmup;
            if (sameWeight && i > 0 && afterWarmup != firstWeight) {
                sameWeight = false;
            }
        }
    }
    if (shortestCount == 1) {
        return invokers.get(shortestIndexes[0]);
    }
    if (!sameWeight && totalWeight > 0) {
        int offsetWeight = ThreadLocalRandom.current().nextInt(totalWeight);
        for (int i = 0; i < shortestCount; i++) {
            int shortestIndex = shortestIndexes[i];
            offsetWeight -= weights[shortestIndex];
            if (offsetWeight < 0) {
                return invokers.get(shortestIndex);
            }
        }
    }
    return invokers.get(shortestIndexes[ThreadLocalRandom.current().nextInt(shortestCount)]);
}
Also used : RpcStatus(org.apache.dubbo.rpc.RpcStatus)

Example 3 with RpcStatus

use of org.apache.dubbo.rpc.RpcStatus in project dubbo by alibaba.

the class ActiveLimitFilterTest method testInvokeRuntimeExceptionWithActiveCountMatch.

@Test
public void testInvokeRuntimeExceptionWithActiveCountMatch() {
    URL url = URL.valueOf("test://test:11/test?accesslog=true&group=dubbo&version=1.1&actives=0");
    Invoker<ActiveLimitFilterTest> invoker = new RuntimeExceptionInvoker(url);
    Invocation invocation = new MockInvocation();
    RpcStatus count = RpcStatus.getStatus(invoker.getUrl(), invocation.getMethodName());
    int beforeExceptionActiveCount = count.getActive();
    try {
        activeLimitFilter.invoke(invoker, invocation);
    } catch (RuntimeException ex) {
        activeLimitFilter.onError(ex, invoker, invocation);
        int afterExceptionActiveCount = count.getActive();
        assertEquals(beforeExceptionActiveCount, afterExceptionActiveCount, "After exception active count should be same");
    }
}
Also used : Invocation(org.apache.dubbo.rpc.Invocation) MockInvocation(org.apache.dubbo.rpc.support.MockInvocation) RuntimeExceptionInvoker(org.apache.dubbo.rpc.support.RuntimeExceptionInvoker) MockInvocation(org.apache.dubbo.rpc.support.MockInvocation) RpcStatus(org.apache.dubbo.rpc.RpcStatus) URL(org.apache.dubbo.common.URL) Test(org.junit.jupiter.api.Test)

Example 4 with RpcStatus

use of org.apache.dubbo.rpc.RpcStatus in project dubbo by alibaba.

the class ActiveLimitFilter method invoke.

@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
    URL url = invoker.getUrl();
    String methodName = invocation.getMethodName();
    int max = invoker.getUrl().getMethodParameter(methodName, ACTIVES_KEY, 0);
    final RpcStatus rpcStatus = RpcStatus.getStatus(invoker.getUrl(), invocation.getMethodName());
    if (!RpcStatus.beginCount(url, methodName, max)) {
        long timeout = invoker.getUrl().getMethodParameter(invocation.getMethodName(), TIMEOUT_KEY, 0);
        long start = System.currentTimeMillis();
        long remain = timeout;
        synchronized (rpcStatus) {
            while (!RpcStatus.beginCount(url, methodName, max)) {
                try {
                    rpcStatus.wait(remain);
                } catch (InterruptedException e) {
                // ignore
                }
                long elapsed = System.currentTimeMillis() - start;
                remain = timeout - elapsed;
                if (remain <= 0) {
                    throw new RpcException(RpcException.LIMIT_EXCEEDED_EXCEPTION, "Waiting concurrent invoke timeout in client-side for service:  " + invoker.getInterface().getName() + ", method: " + invocation.getMethodName() + ", elapsed: " + elapsed + ", timeout: " + timeout + ". concurrent invokes: " + rpcStatus.getActive() + ". max concurrent invoke limit: " + max);
                }
            }
        }
    }
    invocation.put(ACTIVELIMIT_FILTER_START_TIME, System.currentTimeMillis());
    return invoker.invoke(invocation);
}
Also used : RpcException(org.apache.dubbo.rpc.RpcException) RpcStatus(org.apache.dubbo.rpc.RpcStatus) URL(org.apache.dubbo.common.URL)

Example 5 with RpcStatus

use of org.apache.dubbo.rpc.RpcStatus in project dubbo by alibaba.

the class ActiveLimitFilterTest method testInvokeRuntimeException.

@Test
public void testInvokeRuntimeException() {
    Assertions.assertThrows(RuntimeException.class, () -> {
        URL url = URL.valueOf("test://test:11/test?accesslog=true&group=dubbo&version=1.1&actives=0");
        Invoker<ActiveLimitFilterTest> invoker = new RuntimeExceptionInvoker(url);
        Invocation invocation = new MockInvocation();
        RpcStatus count = RpcStatus.getStatus(invoker.getUrl(), invocation.getMethodName());
        int beforeExceptionActiveCount = count.getActive();
        activeLimitFilter.invoke(invoker, invocation);
        int afterExceptionActiveCount = count.getActive();
        assertEquals(beforeExceptionActiveCount, afterExceptionActiveCount, "After exception active count should be same");
    });
}
Also used : Invocation(org.apache.dubbo.rpc.Invocation) MockInvocation(org.apache.dubbo.rpc.support.MockInvocation) RuntimeExceptionInvoker(org.apache.dubbo.rpc.support.RuntimeExceptionInvoker) MockInvocation(org.apache.dubbo.rpc.support.MockInvocation) RpcStatus(org.apache.dubbo.rpc.RpcStatus) URL(org.apache.dubbo.common.URL) Test(org.junit.jupiter.api.Test)

Aggregations

RpcStatus (org.apache.dubbo.rpc.RpcStatus)5 URL (org.apache.dubbo.common.URL)4 Invocation (org.apache.dubbo.rpc.Invocation)2 MockInvocation (org.apache.dubbo.rpc.support.MockInvocation)2 RuntimeExceptionInvoker (org.apache.dubbo.rpc.support.RuntimeExceptionInvoker)2 Test (org.junit.jupiter.api.Test)2 Method (java.lang.reflect.Method)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1 RpcException (org.apache.dubbo.rpc.RpcException)1