Service Fabric Reliable Services: обработка параллельного запроса методами, привязанными к ЦП

Пошаговый параллелизм Azure Service Fabric Reliable Actors описан в официальной документации. Если я правильно понял, Reliable Services могут обслуживать несколько запросов одновременно. Допустим, у меня есть надежный сервис с одним методом, привязанным к процессору. Как и ожидалось, метод является асинхронным, поэтому служба может обрабатывать несколько запросов. Мой локальный кластер размещен на 2-ядерной машине, когда я вызываю Службу из 2 разных клиентов консольного приложения, ЦП используется на 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;
    }

person AsValeO    schedule 11.11.2015    source источник


Ответы (2)


Количество параллельных запросов зависит как от настроек, так и от железа, и вы не можете рассчитывать на параллелизм (или его отсутствие) и порядок выполнения по умолчанию.

Если у вас есть реальная необходимость изолировать параллелизм для последовательного выполнения по очереди, вы должны использовать IReliableQueue‹> или другой Надежные коллекции

Добавьте в свое приложение Service Fabric две службы: интерфейсную, которая помещает элементы в очередь, и другую службу, которая их принимает и обрабатывает. Самое приятное то, что вы все еще можете работать в полную параллель, развернув больше потребителей.

person Sten Petrov    schedule 11.11.2015
comment
Стен, можно ли сказать, что сервис сам решает, как обрабатывать несколько одновременных запросов? И как в этом случае служба поддержки узнает о новинке в Reliable Collection? Всегда проверять метод RunAsync()? Что такое шаблон? Спасибо - person AsValeO; 12.11.2015
comment
ReliableCollection не имеет событий, вы можете либо периодически опрашивать его в своем потребителе, либо вы можете сами предоставить уведомление между производителем и потребителем. Вы даже можете сделать и то, и другое, чтобы получить как надежность, так и производительность. Недостаток уведомлений в том, что вы усложнили бы масштабирование — а масштабирование — это вся причина для SF. - person Sten Petrov; 12.11.2015

По умолчанию задачи выполняются в пуле потоков .NET, поэтому планировщик может пытаться запускать более двух потоков одновременно. Много дополнительной информации о MSDN здесь .

Таким образом, чтобы ограничить ваш параллелизм до Environment. ProcessorCount, вам нужно будет создать свой собственный TaskScheduler, который не использует ThreadPool и ограничивает параллелизм вашим конкретным значением — документы для TaskScheduler содержит хороший пример, иллюстрирующий, как это сделать. Просто подключите свой планировщик к собственному экземпляру TaskFactory, а затем используйте эту фабрику для создания асинхронных задач.

В Примеры для параллельного программирования, на которые ссылается документация, есть целый набор планировщиков, которые вы можете рассмотреть.

person Mark Waterman    schedule 11.11.2015
comment
Хорошо, я понял, Марк. Спасибо за ваше объяснение, оно подходит для локальной разработки. Вот некоторые особенности Service Fabric, о которых идет речь, возможно, кто-нибудь объяснит и их. - person AsValeO; 12.11.2015