Отношения один к одному с каркасом аксона

Я новичок в Axon Framework. У меня есть требование к модулю управления активами, над которым я работаю. В этом модуле создаются различные типы ресурсов, которые необходимо объединить в пары аналогично отношениям «один к одному» в SQL. Мне сложно разработать агрегат для этого формата.

Проверка бизнес-логики выглядит следующим образом: Два assetId являются входами. Эти идентификаторы напоминают совокупные идентификаторы. Затем загрузите экземпляры активов, привязанные к этим assetId, и проверьте, является ли статус непарным или парным. Если оба актива не сопряжены, выполните их сопряжение (обновите статус до сопряженного и добавьте UUID в сопоставленные активы). В противном случае вызовите исключение.

Я придумал следующий агрегатный класс:

@Aggregate
@Data
public class AssetAggregate {
    @AggregateIdentifier
    private UUID assetId;
    private String assetType;
    private HashMap<String,String> attributes;
    private String status;
    private String modifier;
    private UUID associatedAsset;
}

Мое командное сообщение для сопряжения следующее:

@Data
public class PairAssetCommand {
    private UUID assetAId;
    private UUID assetBId;
}

person Darshu Bc    schedule 21.04.2020    source источник
comment
Мне кажется, ваш вопрос на данном этапе слишком общий, @DarshuBc. Попробуйте добавить образец модели запроса и модели команд, немного описав ваш домен. На этом этапе я мог бы ответить на 1000 различных вариантов, ни одного, если бы они, скорее всего, предоставили бы необходимую информацию для выяснения того, как создать модель команд. С моей стороны это немного похоже, но, возможно, вам стоит посмотреть это краткое видео-руководство по Axon - youtube. ru / playlist? list = PL4O1nDpoa5KQkkApGXjKi3rzUW3II5pjm   -  person Steven    schedule 22.04.2020
comment
@Steven Я отредактировал свой вопрос, спасибо за URL-адрес видео-руководства   -  person Darshu Bc    schedule 04.05.2020


Ответы (1)


В приведенном вами примере PairAssetsCommand не может обрабатываться одним AssetAggregate, поскольку он охватывает границу согласованности двух отдельных экземпляров агрегата. А именно два разных AssetAggregates.

Обратите внимание, что агрегат определяет границу согласованности в вашей командной модели. Таким образом, любая принятая им команда и все ее результирующие события (и последующие изменения состояния) будут рассматриваться как атомарная операция. Создание ассоциаций между несколькими объектами может означать две вещи:

  1. Вы создаете более крупный совокупный класс, охватывающий все AssetAggregate.
  2. У вас есть Внешний обработчик команд (т.е. @CommandHandler вне агрегата), который обрабатывает PairAssetsCommand.

Я бы не советовал вариант один, поскольку он расширит границу согласованности по отношению ко всему набору активов в вашей системе. В конечном итоге это станет серьезным узким местом при выполнении требования Агрегата о «соблюдении границы согласованности».

Таким образом, остается вариант 2. Давайте перефразируем определенную вами бизнес-логику:

если оба актива не спарены, то объедините их (обновите статус до парного и добавьте UUID в ассоциированные активы), иначе вызовите исключение

Это означает, что вы не можете проверить на одном экземпляре, но нужно сделать это на нескольких. Опять же, вы можете использовать два пути решения этой проблемы:

  1. Отправьте AssociateWithAssetCommand обоим AssetAggregate и отправьте компенсационную команду, если один из AssetAggregate уже связан.
  2. Во внешней обработчик команд, обрабатывающий PairAssetsCommand для проверки вашей бизнес-логики.

Я бы сказал, какой из двух вариантов лучше. Решение второе требует, чтобы у вас была небольшая модель запроса, содержащая набор активов и их статус связи ». Кроме того, эту модель запроса необходимо обновить в той же транзакции, что и при выполнении команд связывания. Таким образом, несколько сложнее.

Следовательно, первое решение было бы самым простым способом в вашем сценарии.

person Steven    schedule 07.05.2020