Service Fabric Reliable Services:使用 CPU 绑定方法处理并行请求
Service Fabric Reliable Services: proccessing parallel request with CPU-bound methods
Azure Service Fabric's Reliable Actors turn-based concurrency 官方有描述 documentation.As 如果我没看错,Reliable Services, 可以同时处理多个请求。
可以说我有一个可靠的服务,只有一个 CPU-bounded 方法。
方法如预期的那样是异步的,因此服务可以处理多个请求。
我的本地集群托管在 2 核机器上,当我从 2 个不同的控制台应用程序客户端调用服务时,CPU 100% 按预期使用。所以没有理由同时处理超过 2 个请求。我怎样才能限制这个?
如果我搬到真正的集群上,我对托管在机器上的服务一无所知,那我该怎么办?
public async Task<bool> CpuBoundAsync(int value)
{
ServiceEventSource.Current.ServiceMessage(this,
"CPU-BOUND WORK IN PROGRESS");
int z;
await Task.Run(() =>
{
for (int i = 0; i < int.MaxValue; i++)
{
z++;
z--;
}
});
ServiceEventSource.Current.ServiceMessage(this,
"CPU-BOUND WORK COMPLETED");
return true;
}
默认情况下,.NET 线程池上的任务 运行,这就是为什么调度程序可能会尝试同时 运行 超过 2 个线程。有关 MSDN here 的更多信息。
因此,将并发限制为 Environment.ProcessorCount, you would need to create your own custom TaskScheduler that doesn't use the ThreadPool and limits concurrency to your specific value--the docs for the TaskScheduler 有一个很好的示例说明了如何执行此操作。只需将您的调度程序插入您自己的 TaskFactory 实例,然后使用该工厂生成您的异步任务。
文档 link 的 Samples for Parallel Programming 有一大堆您可能会考虑的调度程序。
并行请求的数量取决于设置和硬件,您不能真正指望默认情况下的并行度(或缺乏)和执行顺序。
如果你有一个 真正的 需要隔离并发以按顺序一次一个,你应该使用 IReliableQueue<> or other Reliable Collections
向您的 Service Fabric 应用程序添加两个服务 - 一个将项目放入队列的前端,另一个服务接收并处理它们。最好的部分是你仍然可以通过部署更多的消费者来完全并行。
Azure Service Fabric's Reliable Actors turn-based concurrency 官方有描述 documentation.As 如果我没看错,Reliable Services, 可以同时处理多个请求。 可以说我有一个可靠的服务,只有一个 CPU-bounded 方法。 方法如预期的那样是异步的,因此服务可以处理多个请求。 我的本地集群托管在 2 核机器上,当我从 2 个不同的控制台应用程序客户端调用服务时,CPU 100% 按预期使用。所以没有理由同时处理超过 2 个请求。我怎样才能限制这个? 如果我搬到真正的集群上,我对托管在机器上的服务一无所知,那我该怎么办?
public async Task<bool> CpuBoundAsync(int value)
{
ServiceEventSource.Current.ServiceMessage(this,
"CPU-BOUND WORK IN PROGRESS");
int z;
await Task.Run(() =>
{
for (int i = 0; i < int.MaxValue; i++)
{
z++;
z--;
}
});
ServiceEventSource.Current.ServiceMessage(this,
"CPU-BOUND WORK COMPLETED");
return true;
}
默认情况下,.NET 线程池上的任务 运行,这就是为什么调度程序可能会尝试同时 运行 超过 2 个线程。有关 MSDN here 的更多信息。
因此,将并发限制为 Environment.ProcessorCount, you would need to create your own custom TaskScheduler that doesn't use the ThreadPool and limits concurrency to your specific value--the docs for the TaskScheduler 有一个很好的示例说明了如何执行此操作。只需将您的调度程序插入您自己的 TaskFactory 实例,然后使用该工厂生成您的异步任务。
文档 link 的 Samples for Parallel Programming 有一大堆您可能会考虑的调度程序。
并行请求的数量取决于设置和硬件,您不能真正指望默认情况下的并行度(或缺乏)和执行顺序。
如果你有一个 真正的 需要隔离并发以按顺序一次一个,你应该使用 IReliableQueue<> or other Reliable Collections
向您的 Service Fabric 应用程序添加两个服务 - 一个将项目放入队列的前端,另一个服务接收并处理它们。最好的部分是你仍然可以通过部署更多的消费者来完全并行。