Резюме: у меня есть веб-приложение, которое выполняет рабочие процессы на бизнес-объектах, и иногда мне нужно намеренно ждать несколько секунд или минут между шагами.Я ищу (возможно, через Rx.NET), чтобы улучшить выполнение этих рабочих процессов, чтобы я не исчерпал ThreadPool и сделал веб-сайт не отвечающим, когда система находится под большой нагрузкой.
Очень упрощенная версиярабочий процесс:
- Создание объекта
- Загрузка данных в него из системы A
- POST эти данные в систему B
Если система A не работает, мое приложение ждет и повторяет попытку позже.Время ожидания смоделировано после увеличивающихся задержек повторения в GMail: подождите 1 секунду, удваивайте при каждой последующей повторной попытке (максимально через 1 час).Приложение одержимо сохраняет состояние в базе данных, поэтому, если все приложение взорвется, при перезапуске оно возобновит все рабочие процессы, с которых оно остановилось.
В настоящее время (пожалуйста, будьте осторожны) каждый шаг в рабочем процессе выполняется путем вызоваThreadPool.QueueUserWorkItem, чтобы поставить в очередь метод, который вызывает Thread.Sleep, если необходимо для задержки повторения, описанной выше, а затем фактически выполняет шаг.
Если система работает хорошо (без ошибок), она может легко обработать всетрафик, который мы добавляем, и ThreadPool прекрасно управляет параллельным выполнением всех этих экземпляров рабочего процесса.Но если система B некоторое время не работает, число повторных попыток и, соответственно, задержка возрастают, и довольно скоро ThreadPool заполняется всеми спящими потоками, в результате чего веб-сайт перестает отвечать на новые запросы.
По сути, я хочувыбросить все эти ожидающие рабочие процессы в очередь, упорядоченную по (время последнего выполнения + желаемая задержка повторных попыток).Несмотря на то, что я много читал о Rx и восхищался им, у меня никогда не было возможности его использовать, но, похоже, это может быть полезным способом справиться с этим.Если Rx может волшебным образом управлять выплевыванием этих объектов, когда они готовы к стрельбе, кажется, что это
- значительно упростит и прояснит эту логику и
- предотвратит расточительное использование лотовпотоков, которые просто спят 99% времени
Будем весьма благодарны за любые указания новичку в Rx, даже если это просто объяснение того, почему это на самом деле не очень хороший вариант использования для Rx.