Service Fabric:服务之间的调用有延迟吗?
Service Fabric: Calls between services are delayed?
我们正在开发一个由多个不同服务组成的服务结构应用程序,我们的应用程序工作方式的一个关键部分是这些服务需要大量相互调用。
直到最近,当我们增加应用程序的负载并发现它的速度大大降低时,我们才遇到问题。经过大量调查和计时各种事情后,我们发现问题似乎是当我们对一种类型的服务(我们有几个实例)进行大量调用时,调用似乎在我们调用服务之间有一些延迟,服务实际上开始处理请求。
我们正在按照 Microsoft 的描述在服务之间调用 here
说得更清楚一点:ServiceA获取ServiceB的引用,然后调用ServiceB.GetResult(),我们在ServiceA中记录这个方法被调用的时间,我们在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))
};
}
我们正在开发一个由多个不同服务组成的服务结构应用程序,我们的应用程序工作方式的一个关键部分是这些服务需要大量相互调用。
直到最近,当我们增加应用程序的负载并发现它的速度大大降低时,我们才遇到问题。经过大量调查和计时各种事情后,我们发现问题似乎是当我们对一种类型的服务(我们有几个实例)进行大量调用时,调用似乎在我们调用服务之间有一些延迟,服务实际上开始处理请求。
我们正在按照 Microsoft 的描述在服务之间调用 here
说得更清楚一点:ServiceA获取ServiceB的引用,然后调用ServiceB.GetResult(),我们在ServiceA中记录这个方法被调用的时间,我们在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))
};
}