HTTP-ответ асинхронной операции микросервисов

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

Создать поток проекта

Мой вопрос: какой ответ HTTP должен возвращать шлюз API клиенту (шаг 1)?

Моя первоначальная идея состояла в том, чтобы вернуть 202, но проблема в том, что я еще не знаю Location (/projects/{id}), потому что идентификатор проекта будет создан в службе управления проектами.


person Jan-Paul Kleemans    schedule 11.05.2017    source источник
comment
Когда вы создаете идентификаторы, до/когда создается команда (т. е. GUID) или после сохранения project (т. е. первичные ключи с автоинкрементом)?   -  person Constantin Galbenu    schedule 11.05.2017
comment
Идентификатор проекта генерируется службой управления проектами. Итак, после того, как он получит команду и до того, как опубликует событие.   -  person Jan-Paul Kleemans    schedule 11.05.2017
comment
Жаль, это все усложняет. Итак, когда вы возвращаете ответ клиенту, вы не знаете ни идентификатора проекта, ни статуса команды, верно?   -  person Constantin Galbenu    schedule 11.05.2017
comment
Это верно. Единственное, что мы знаем, это то, что команда подтверждена.   -  person Jan-Paul Kleemans    schedule 11.05.2017
comment
Итак, вам понадобится command id, который генерируется API-шлюзом и возвращается клиенту следующим образом: /pending/commands/1234-abcd-5678-efgh   -  person Constantin Galbenu    schedule 11.05.2017
comment
И в этой конечной точке /pending/commands/1234-abcd-5678-efgh клиент может запросить результат command или url в project, если он уже создан.   -  person Constantin Galbenu    schedule 11.05.2017
comment
Что вы думаете?   -  person Constantin Galbenu    schedule 11.05.2017
comment
Да, я думаю, это хорошее решение. Для нас немного непрактично отслеживать все команды в нашем шлюзе.   -  person Jan-Paul Kleemans    schedule 11.05.2017
comment
Это цена командного стиля «выстрелил-забыл».   -  person Constantin Galbenu    schedule 11.05.2017


Ответы (1)


Учитывая, что идентификаторы вновь созданного объекта project неизвестны во время запроса (т.е. он генерируется после вставки в базу данных), вы действительно не можете создать URL-адрес ресурса project.

Вместо этого вы можете присвоить команде идентификатор (например, 1234-abcd-5678-efgh) перед отправкой в ​​шину и отслеживать статус ее выполнения на самом API-шлюзе. Затем вы можете ответить клиенту с помощью конечной точки состояния выполнения команды, такой как /commands/1234-abcd-5678-efgh, где он может запрашивать путем опроса.

Альтернативой может быть использование другой службы, которая резервирует и доставляет уникальные идентификаторы, но вы должны сделать блокирующий вызов, а это вредит масштабируемости. Или вы можете разместить эту службу внутри самого шлюза API (на том же узле), чтобы свести к минимуму задержку. Кроме того, существует риск потери некоторых идентификаторов в случае сбоев при создании проекта, но это можно компенсировать, освобождая эти идентификаторы в таких ситуациях (таким образом увеличивая сложность архитектуры).

Третьим решением может быть использование суррогатного идентификатора project, такого как GUID, назначенного как свойство project, включенного в команду, с целью альтернативного идентификатора, который можно использовать только на этапе предварительного создания команды. процесс. Тогда ответ клиенту может быть таким: /projects/by-guid/1234-abcd-5678-efgh и после создания project GET на этот url будет постоянно перенаправляться на окончательный URL-адрес проекта.

person Constantin Galbenu    schedule 11.05.2017