, поэтому в настоящее время я внедряю сагу с аксоном, используя источники событий и CQRS.
Обстоятельства следующие:
У меня 3 микросервиса, м1, м2 и м3
Пользователь вводит данные для 3 сущностей e1, e2, e3 в GUI, которые обрабатываются и сохраняются с помощью 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**)}}
Я просто создаю объект, который содержит информацию для этих трех сущностей? Это действительно неправильно.
Теперь я понимаю, что, может быть, очень плохо выбирать такую модель предметной области, и, возможно, следует избегать ее, если это возможно, но для наглядности: -)