Я создаю серверную часть веб-сайта, в которой клиент отправляет запрос на выполнение какой-то дорогостоящей (по времени) операции. Дорогостоящая операция также включает в себя сбор некоторого набора информации для ее завершения.
Работа, которую отправляет клиент, может быть полностью описана uuid
. Я надеюсь использовать сервис-ориентированную архитектуру (SOA) (т.е. несколько микросервисов).
Клиент взаимодействует с серверной частью, используя связь RESTful через HTTP. Я планирую использовать очередь, которую рабочие, выполняющие дорогостоящую операцию, могут опрашивать для работы. Очередь обладает постоянством и предлагает достойную семантику надежности.
Одно из соображений заключается в том, собираю ли я все данные, необходимые для дорогостоящей операции вверх по течению, а затем ставлю все эти данные в очередь, или я просто ставлю в очередь uuid
и позволяю рабочему извлекать данные.
Вот схемы двух рассматриваемых архитектур:
На основе push-уведомлений (т. е. сбор данных вверх по течению):
На основе извлечения (т. е. работник собирает данные):
Некоторые вещи, о которых я подумал:
- В случае с push-уведомлением я, скорее всего, буду блокироваться, пока собираю необходимые данные, поэтому на HTTP-запрос клиента не будет дан ответ до тех пор, пока данные не будут собраны, а затем поставлены в очередь. С точки зрения пользовательского интерфейса запрос будет отложен до тех пор, пока не вернется ответ.
- В сценарии на основе извлечения только рабочий должен знать, какие данные требуются для работы. Это означает, что у меня может быть несколько типов клиентов, взаимодействующих с разными бэкендами. Если данные нуждаются в изменении, я обновляю только рабочие процессы, а не каждую из вышестоящих служб.
Что-нибудь еще, что мне здесь не хватает?