Service Fabric Reliable Services:使用CPU绑定方法处理并行请求



AzureService Fabric的Reliable Actors基于回合的并发在官方文档中有描述。如果我做对了,可靠服务可以同时为多个请求提供服务。比方说,我有一个可靠的服务与单CPU有界的方法。方法是异步的,因此服务可以处理多个请求。我的本地集群托管在2核机器上,当我从2个不同的控制台应用程序客户端调用服务时,CPU的利用率达到了预期的100%。因此,没有理由同时处理两个以上的请求。我该如何限制?如果我转移到真正的集群,我对托管在其上的机器服务一无所知,那么我该怎么办?

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;
    }

并行请求的数量取决于设置和硬件,默认情况下,您不能真正指望并行性(或缺乏并行性)和执行顺序。

如果您有实际需要按照一次一个的顺序隔离并发性,则应使用IReliableQueue<>或其他可靠集合

在Service Fabric应用程序中添加两个服务——一个是将项目放入队列的前端,另一个是接收并处理项目的服务。最棒的是,你仍然可以通过部署更多的消费者来完全并行。

默认情况下,任务在.NET的线程池上运行,这就是为什么调度程序可能试图一次在两个以上的线程上运行。在MSDN上有更多信息。

因此,要将您的并发限制为Environment.ProcessorCount,您需要创建自己的自定义TaskScheduler,它不使用线程池,并将并发限制为您的特定值——TaskScheduler的文档中有一个很好的示例说明了如何做到这一点。只需将调度程序插入您自己的TaskFactory实例,然后使用该工厂生成异步任务。

文档链接到的Samples for Parallel Programming有一大堆可以考虑的调度器。

最新更新