Service Fabric:服务之间的呼叫是否延迟?

时间:2017-02-02 14:33:54

标签: c# azure azure-service-fabric

我们正在开发由多种不同服务组成的服务结构应用程序,而我们的应用程序工作方式的关键部分是这些服务需要大量调用。

直到最近,当我们增加应用程序的负载并发现它大幅减速时,我们没有遇到任何问题。在经过多次调查和计时之后,我们发现问题似乎是当我们对一种类型的服务(我们有多个实例)进行大量调用时,调用似乎是我们调用服务之间的一些延迟,服务实际上开始处理请求。

我们正在按照Microsoft here

所述的服务之间进行呼叫

更清楚:ServiceA获取对ServiceB的引用,然后调用ServiceB.GetResult(),我们记录在ServiceA中调用此方法的时间,我们在GetResult()中做的第一件事是记录时间处理开始。当没有负载时,只有几毫秒,一旦我们增加负载,我们发现在这些时间之间存在 4-5秒延迟。

这是服务面料的某种限制吗?我们有多个ServiceB实例,集群上的资源使用基本上没什么,CPU占用大约10%,所有节点上的内存使用率约为1/4,但是服务的吞吐量非常低,因为它在这里等待。

为什么要等?对于服务一次可以处理的不同呼叫,是否存在某种定义的限制?我们的沟通有问题吗?

谢谢。

1 个答案:

答案 0 :(得分:6)

MaxConcurrentCalls设置似乎就是我所需要的。

连接服务时:

            FabricTransportSettings transportSettings = new FabricTransportSettings
            {
                MaxConcurrentCalls = 32
            };

            ServiceProxyFactory serviceProxyFactory = new ServiceProxyFactory(
                (c) => new FabricTransportServiceRemotingClientFactory(transportSettings));

            service = serviceProxyFactory.CreateServiceProxy<T>(serviceUri);

创建服务监听器:

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
    {
        FabricTransportListenerSettings listenerSettings = new FabricTransportListenerSettings
        {
            MaxConcurrentCalls = 32
        };
        return new[]
        {
            new ServiceInstanceListener(
            (context) => new FabricTransportServiceRemotingListener(context,this,listenerSettings))
        };
    }