Архитектура веб-приложения - Требуется очередь заданий / задач?

В настоящее время я разрабатываю веб-приложение, которое позволит пользователям планировать задачи, которые будут выполняться с помощью HTTP API (от их имени). Задачи могут повторяться, и минимальное временное разрешение, которое можно использовать для планирования, составляет одну минуту. Я считаю, что из-за характера задач имеет смысл выполнять их асинхронно. Однако как должна выглядеть архитектура этой части?

Я подумал об использовании очереди задач для создания задач веб-приложением и позволить им выполнять их работником. В этом случае у меня есть несколько вопросов:

  • Как справляться с повторяющимися задачами?
  • Как мне легко сохранить результаты задач?
  • Можно ли сделать очередь «постоянной»?
  • Должны ли рабочие напрямую взаимодействовать с базой данных?
  • Должен ли я вручную ставить в очередь повторяющиеся задачи?

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


person Simon    schedule 30.04.2011    source источник
comment
Это актуально. Он показывает, как реализовать будущие задачи в node.js. Просто измените выполнение заданий, отправив HTTP-запрос.   -  person Raynos    schedule 06.05.2011


Ответы (1)


Да, это хорошо известный шаблон для обработки долгоживущих задач в серверной части веб-приложения. В зависимости от вашего языка и структуры приложения существует ряд реализаций очереди - например, Resque или Beanstalkd или ActiveMQ или, если ваши требования к производительности невысоки, вы можете использовать таблицу базы данных как своего рода очередь.

Основная идея заключается в том, что ваше веб-приложение помещает задания в очередь с достаточным содержанием, чтобы их можно было продолжить. Группа рабочих процессов в фоновом режиме (в идеале, работающих независимо от вашего веб-приложения) считывает задания из очереди и выполняет их. Результаты могут быть записаны обратно в очередь ответов или, возможно, записаны в базу данных. Это зависит от того, как вы хотите отображать результаты обратно пользователю. Для веб-приложения запись результатов в базу данных, вероятно, имеет больше смысла.

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

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

Прямая очередь сообщений будет обрабатывать / передавать сообщения работникам, как только они становятся доступными. Так что составление расписания сложно или невозможно. Для поддержки запланированных заданий (включая задания, которые повторяются в заданное время или по прошествии некоторого времени) вам, вероятно, следует использовать таблицу базы данных как простую очередь с атрибутом «время начала».

Недавно я описал похожий шаблон здесь.

person scaganoff    schedule 06.05.2011
comment
Предположим, я использую RabbitMq, нужна ли мне запущенная служба для управления очередью? Как обычно выполняется эта работа? Какая альтернатива услуге? - person SynBiotik; 23.02.2016