так что в настоящее время я реализую сагу с фреймворком аксонов, используя источники событий и CQRS.
Обстоятельства следующие:
У меня 3 микросервиса, m1, m2 и m3
Пользователь вводит данные для 3 сущностей e1, e2, e3 в графическом интерфейсе пользователя, которые обрабатываются и сохраняются m1, m2, m3 соответственно, поэтому m1-> e1, m2-> e2, m3-> e3
Теперь о необходимости саги:
e1 не может существовать без e2, а e2 не может существовать без e3.
Таким образом, все 3 объекта должны быть успешно созданы соответствующими службами, и если одна из них выйдет из строя, саге необходимо выполнить компенсационные транзакции для обеспечения согласованности. Сначала m1 создает e1, испускает e1CreatedEvent, а оркестратор отправляет createE2Command в качестве реакции на это и т. Д.
Теперь мои проблемы:
Как мне получить / сохранить информацию, которую вводит пользователь? В одном RequestBody? Тогда что мне делать с этими данными? Потому что его нужно как-то кэшировать, чтобы отправлять с командами.
Например, m1 создает команду createE1Command и добавляет к ней информацию из e1, затем после ее успешного создания оркестратор инициирует createE2Command и ЗАТЕМ добавит информацию для e2 в эту команду перед ее отправкой .... для этого необходимо, чтобы информацию для e2 нужно как-то хранить до тех пор, пока она не понадобится.
Образец кода:
@Saga
public class ManagementSaga{
@Autowired
private transient CommandGateway commandGateway
@StartSaga
@SagaEventhandler
public void handle (e1CreatedEvent e1CreatedEvent){
commandGateway.send (new CreateE2Command (e1CreatedEvent.Id, **HERE NEEDS TO BE THE INFO THAT THE USER CREATED PREVIOUSLY**)}}
Могу ли я просто создать объект, содержащий информацию для этих трех сущностей? Это действительно неправильно.
Теперь я понимаю, что, может быть, выбирать такую модель предметной области действительно плохо, и, вероятно, следует избегать этого, если это возможно, но это на всякий случай :-)