LINUX.ORG.RU

Архитектура системы с долгими вычислениями

 , ,


1

1

Предположим, для каждого пользователя, который обратился к определенному урлу, у меня начинаются вычисления которые могут длиться порядка 10-ти секунд (или больше). Тут же появляется вопрос что делать, чтобы пользователь этих 10 секунд не видел пустую страницу. Я вычитал много интересной информации, которую пока не до конца структурировал, поэтому вижу следующие пути решения:

  • Использовать очереди сообщений и синхронный бэкенд сервер. В этом случае сервер создает сокет соединение с клиентом и отдает ему html страницу (стили, скрипты и все остальное в этом духе отдает nginx), а в очередь отдает задачу на вычисления и после получения ответа от очереди пушит клиенту результат.
  • Использовать асинхронный веб-сервер (python tornado, node.js). Знаю что tornado создает экземпляр класса для каждого клиента и при этом в цикле не забывает о других пользователях. Поэтому, как я понимаю, можно отдать пользователю html, настроив сокет соединение, и прямо в классе вьюхи вызвать функцию вычислений и пушить клиенту результат.
  • Наверное, никто не станет бить меня по рукам и губам, если я подумаю об использовании асинхронного сервера и очереди, но сам я пока не вижу с этого выгоды.

Объясните, пожалуйста, в чем преимущества каждого из способов, какие варианты еще есть и правильно ли я вообще себе все представляю. Понимаю, что объяснять это все долго, поэтому буду благодарен и если просто закидаете меня кучей ссылок :)


Нарисуй красивую страничку, на ней AJAX'ом сделай свой долгий запрос и жди ответа.

Deleted ()
Ответ на: комментарий от Deleted

а вычислять лучше вызывая необходимую функцию из очереди или поднять для этого асинхронный сервер?

dokes ()
Ответ на: комментарий от dokes

выносить в отдельные от веб-ифейса асинхронные таски. которые способны выполняцо даже если веб-ифейс мертв.

exception13 ★★★★★ ()

Пользователь жмет кнопку -> уходит запрос на сервер.
Пользователь может закрыть страницу или походить по другим, он не ждет сервер, а сервер уже работает над его проблемой либо поставил ее в очередь если еще 100500 таких же, а ресурсы ограничены.
Когда проблема решена, пользователю приходит уведомление в интерфейсе либо почтовое сообщение, либо смс.

Это типичный task queue, никакой асинхронный сервер тут не нужен, висеть сокетом просто так все это время тоже бессмысленно, тебе же не нужно в этот момент обмениваться никакими данными.

umren ★★★★★ ()

я думаю, преимущества оторвать руки веб-девелоперу очевидны.

darkenshvein ★★★★★ ()

При запросе сервер начинает вычисления. При этом генерирует уникальный ID. На сервере хранится отображение ID -> Results. Results это либо информация о текущем прогрессе, либо непосредственно результаты вычислений. Хранить целесообразно в базе, если результаты должны сохраняться. Сразу после начала вычислений клиенту отдаётся ID и вычисления продолжаются в фоновом потоке.

Клиент периодически запрашивает сервер о статусе вычислений, используя возвращённый ID. Когда вычисления будут завершены, клиент покажет пользователю результаты вычислений.

Legioner ★★★★★ ()

Эффективное по все параметрам решение - это и очередь и асинхронный сервер. Схема такая - создается в БД задача на выполнение, в очередь пихается уведомление о выполнении этой таски. Процесс-воркер разгребает очередь задач, выполняет задачу, меняет статус задачи в БД. Асинхронный сервер имеет comet соединение с барузером и отдает актуальный статус задачи. Плюс такого решения в том, что пользователь может уйти со страницы, вернуться и в режиме реального времени видет акутальный статус выполнения задачи.

dizza ★★★★★ ()
Ответ на: комментарий от dizza

при этом готовых решений уже хватает, например web2py имеет свой, довольно приятный в обращении, Scheduler.

Если у ТС стоит задача сделать небольшой веб-сервис научного толка (судя по описанию), то web2py отличный комбайн для такой задачи, который избавляет от большого количества головной боли.

silw ★★★★★ ()

завод, фабрика, непрерывное производство, например практически непрерывное производство: «ликёрка»

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.