Мы находимся в процессе редизайна нескольких наших конечных точек API REST для перехода на архитектуру микросервиса.
Здесь мы работаем над конечной точкой /invitations/:id/confirm
.
Эта конечная точка создает User
, Account
, используя предоставленные Invitation
.
У нас есть 3 агрегата Invitation
, User
и Account
.
Номинальный поток, которым мы являемся в настоящее время , следующий:
- Проверьте, существует ли
Invitation
- Убедитесь, что приглашение может быть подтверждено
- Создать
User
- Создать
Account
- Удалить
Invitation
- Возврат
UserId
Эта операциясделано в процессе, который объяснил, почему мы можем вернуть UserId сразу.Мы просто загружаем наши агрегаты из базы данных, выполняем соответствующую бизнес-логику и сохраняем результат.
Для внедрения микроуслуг потребуется асинхронная обработка.Другими словами, мы должны отправить команду на шину и вернуть код состояния 202.
В нашем плане мы хотим запустить команду с именем RequestInvitationConfirmation
.Базовая проверка будет происходить при создании этой команды.
Затем эта команда будет отправлена через шину потребителю, который отвечает за: - загрузку агрегатов приглашений (убедитесь, что они существуют) - вызов методов RequestConfirmation (проверит, что приглашение может быть подтверждено) - повышениесобытие InvitationConfirmationRequested
Событие InvitationConfirmationRequested
инициирует SAGA, отвечающую за организацию связи между службами
OnInvitationConfirmationRequested
- Отправка
CreateUser
команда
OnUserCreated
- Отправить
CreateAccount
команда
OnAccountCreated
- Отправить
DeleteInvitation
команда
OnInvitationDeleted
- Повышение
InvitationConfirmed
Поскольку оно асинхронное, мы должны предоставитьспособ получить текущее рабочее состояние.Я видел (https://www.adayinthelifeof.nl/2011/06/02/asynchronous-operations-in-rest/, https://asyncrestapi.docs.apiary.io/#), что общий подход состоит в том, чтобы предложить конечные точки /queue/:id
ИЛИ /actions/:id
.
Вот где мы запутались. Как вы можете предложитьодна конечная точка, когда состояния могут полностью отличаться от SAGA к другому?
Thx