Мы внедряем REST API, который будет запускать несколько длинных backend-задач. Я читал Поваренную книгу веб-служб RESTful, и рекомендация - вернуть HTTP 202/Accepted с заголовком Content-Location, указывающим на обрабатываемую задачу. (например, http://www.example.org/orders/tasks/1234), и попросите клиента опросить этот URI для обновления в долгосрочной перспективе.Долгосрочный API REST с очередями
Идея состоит в том, чтобы API-интерфейс REST немедленно отправил сообщение в очередь, при этом рабочая роль фона собирала сообщение из очереди и разворачивала несколько задач backend, также используя очереди. Проблема, которую я вижу при таком подходе, заключается в том, как назначить уникальный идентификатор задаче, а затем позволить клиенту запросить статус задачи, выдав GET в URI Content-Location.
Если API-интерфейс REST немедленно отправляется в очередь, он может генерировать GUID и прикреплять его как атрибут к сообщению, добавляемому в очередь, но получение статуса запроса становится неудобным.
Другой вариант заключается в том, чтобы REST API сразу добавлял запись в базу данных (скажем, заказ с новым идентификатором заказа) с начальным статусом, а затем затем помещал сообщение в очередь, чтобы начать назад, которые впоследствии будут обновлять эту запись базы данных. API вернет этот новый идентификатор заказа в URI заголовка Content-Location, который клиент будет использовать при проверке состояния задачи.
Как-то сначала добавляем запись в базу данных, а затем добавление сообщения в очередь кажется обратным, но только добавление запроса в очередь затрудняет отслеживание прогресса.
Каким будет рекомендуемый подход?
Большое спасибо за ваши идеи.
Большое спасибо за ваши идеи. Я все для прагматичных решений, поэтому кажется, что подход к единой базе данных будет достаточным. Модель задачи может быть расширена и для включения подзадач, если API поддерживает агрегированный запрос. Благодаря! – user2079172
Спасибо за обновление и предложение! :) Эта настройка была бы надежным решением. Наши интеграторы, возможно, не смогут поддерживать соединение открытым (устаревшие системы), но, скорее всего, смогут сделать опрос. Преодоление REST API и подход 202/Accepted с служебной шиной/очередью - это разрыв для меня. В идеале служебная шина/очередь будет точкой интеграции для других систем, и API в этом случае - это еще один способ интеграции другой системы с служебной шиной (Channel Adapter). Для того, чтобы предлагаемая настройка работала, нам понадобится еще один уровень абстракции, который имеет значение – user2079172
update_event, как я его вижу. Таким образом, API: 1. вставьте новую строку в таблицу update_event и верните новый идентификатор. 2: немедленно вставьте новый запрос в очередь служебной шины. Теперь клиент может опросить и т. Д. Роль рабочего 1: собирает сообщение о очереди и отправляет рабочий процесс бэкэнд. 2: как только это будет сделано, ему придется обновить таблицу update_event новым URI-реестром и т. Д. Проблема здесь в том, что рабочая роль станет осведомленной о клиенте со специальными требованиями или? Значит, он больше не является общим для системы обмена сообщениями? – user2079172