Мой блог

Связанные задачи

Всегда есть такие пользовательские задачи, которые представляют из себя несколько связанных подзадач. На рисунке ниже представлен типичный пример такой задачи.

Обработка связанных задач на сервере

Классический пример связанных задач с обработкой на сервере.
  • Если подзадача «Произвести расчеты» завершается ошибкой, то вся задача завершается ошибкой.
  • Если подзадача «Обновить пользовательские данные» завершается ошибкой, то предыдущий результат отбрасывается, а вся задача завершается с ошибкой.
  • Неудача при уведомлении пользователя или администратора не влияет на результат задачи. Задача завершается успешно.

Самый очевидный вариант решения - это выполнить всю последовательность на сервере, а клиенту вернуть результат выполнения. Преимуществом такого подхода является его простота. Недостатком является то, что весь обработчик запроса будет выполняться одним сервером. Что если подзадача «Произвести расчеты» занимает несколько часов / дней / месяцев?

Обработка связанных задач на клиенте

Второй вариант - это вынести управление подзадачами, на клиентский код. Тогда схема обработки будет как на рисунке ниже.

Пример связанных задач, с обработкой на клиенте

Основным преимуществом данного подхода является его масштабируемость. Разные подзадачи могут обрабатываться разными серверами. Задача «Произвести расчеты» может обрабатываться сколько угодно долго. В случае ошибки можно повторить отдельно взятую позадачу. Основной недостаток, увы, это безопасность. Клиентский код исполняется на мощностях клиента и является небезопасной средой. Далеко не все данные можно передавать клиенту. Если на клиентских мощностях будут обрабатываться персональные данные пользователей – это рано или поздно плохо кончится. Второй недостаток – сильно ограниченные объемы данных, которые можно передавать между клиентом и сервером.

Обработка связанных задач планировщиком

Особый интерес у меня вызывают архитектурные решения с применением планировщика. Главной особенностью таких подходов, является то, что мы не пытаемся выполнить задачу «здесь и сейчас». Вместо этого мы ее планируем. Мы можем установить время выполнения задачи, максимальный период ожидания, количество попыток. Можно создавать задачи, выполняющиеся с заданным интервалом. Все это открывает большие возможности для разработки приложений, производительность которых, линейно увеличивается с ростом количества серверов. Если, в приведенной выше, схеме использовать планировщик, то она могла бы выглядеть так.

Обработка связанных задач с помощью планировщика

С применением планировщика, выполнением одной задачи может заниматься группа серверов. Если один сервер планирует задачу, то выполнять ее может второй сервер, а уведомление о выполнении получить уже третий. Вычислительные расчеты может выполнять сразу несколько серверов, а планировщик дождется выполнения задачи всеми серверами. В такой архитектуре можно настроить повторное выполнение блока задач, который не был выполнен в связи со сбоем оборудования. Сервера могут быть объединены быстрым каналом и находится в защищенной сети. Так что защита информации и передача больших объемов данных уже не будет такой проблемой.

06 мар.2018