我们正在开发一个由多个不同服务组成的服务结构应用程序,我们的应用程序工作方式的一个关键部分是这些服务需要大量相互调用。
我们一直没有遇到任何问题,直到最近我们增加了应用程序的负载,发现它的速度大大减慢了。经过大量调查和对各种事情进行计时后,我们发现问题似乎是,当我们对一种类型的服务(其中我们有多个实例)进行大量调用时,调用似乎在我们调用服务之间存在一些延迟,并且服务实际上开始处理请求。
我们正在按照 Microsoft here 的描述在服务之间进行调用
更清楚地说:ServiceA 获取对 ServiceB 的引用,然后调用 ServiceB.GetResult(),我们记录 ServiceA 中调用此方法的时间,而在 GetResult() 中我们做的第一件事就是记录 ServiceB.GetResult() 调用该方法的时间。处理开始。当没有负载时,只有几毫秒,一旦我们增加负载,我们发现这些时间之间有4-5秒延迟。
这是服务结构中的某种限制吗?我们有多个 ServiceB 实例,集群上的资源占用基本上没什么,所有节点上 CPU 徘徊在 10% 左右,内存占用约为 1/4,但服务的吞吐量非常低,因为它在这里等待。
为什么要等?对于服务一次可以处理的不同调用的数量是否存在某种定义的限制?我们的沟通是否出了问题?
谢谢。
最佳答案
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))
};
}
关于c# - 服务结构: Calls between services are delayed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42004928/