0

Azure Service Fabric的 Reliable Actors 基于回合的并发在官方文档中有描述。如果我没看错的话,Reliable Services可以同时服务多个请求。假设我有一个具有单一 CPU 限制方法的可靠服务。方法是异步的,所以服务可以处理多个请求。我的本地集群托管在 2 核机器上,当我从 2 个不同的控制台应用程序客户端调用 Service 时,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;
    }
4

2 回答 2

1

默认情况下,任务在 .NET 的线程池上运行,这就是为什么调度程序可能一次尝试在超过 2 个线程上运行的原因。更多关于 MSDN 的信息

因此,要将并发限制为Environment.ProcessorCount,您需要创建自己的自定义 TaskScheduler ,它不使用 ThreadPool 并将并发限制为您的特定值 - TaskScheduler的文档有一个很好的示例来说明如何执行此操作. 只需将您的调度程序插入您自己的 TaskFactory 实例,然后使用该工厂来生成您的异步任务。

文档链接到的并行编程示例有一大堆您可能会考虑的调度程序。

于 2015-11-11T21:46:23.853 回答
1

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

如果您确实需要将并发隔离为一次一个有序,您应该使用IReliableQueue<>或其他可靠集合

将两项服务添加到您的 Service Fabric 应用程序 - 一个将项目放入队列中的前端和另一个接收并处理它们的服务。最好的部分是您仍然可以通过部署更多消费者来完全并行。

于 2015-11-11T22:01:23.260 回答