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 应用程序添加两个服务 - 一个将项目放入队列的前端,另一个服务接收并处理它们。最好的部分是你仍然可以通过部署更多的消费者来完全并行。