@mcakaneo
Я люблю пиццу

Как реализовать операцию, которая изменяет состояние нескольких aggregate roots, в приложении с распределённой базой данных?

Изменение и сохранение нескольких aggregates в одной транзакции, имеет свои минусы, самый неприятный минус: aggregates должны находиться на одном сервере(в одной БД), иначе их нельзя будет сохранить в одной транзакции.

Естественно мне сейчас не нужно это и вряд ли понадобится в ближайшее время, просто очень хочу знать как правильно решать такие задачи.
Если я правильно понял, то для этого нужны Domain Events и Process Manager.
Но я, к большому сожалению и удивлению, нигде не нашёл нормального примера реализации(возможно плохо искал). Особенно меня удивило и расстроило то, что нет примеров с системой друзей в социальной сети.
Может кто-то реализовывал как раз подобную систему, где нужно за раз изменить состояние двух пользователей, то есть, например, если user1 отправляет запрос на дружбу user'у2, то это изменяет его состояние и состояние user'а2, который получает запрос на дружбу(именно получает, а не принимает). А если user2 принимает(подтверждает) запрос на дружбу от user1, то они становятся друзьями и это также изменяет состояние обеих(содержат ID друг друга).

Или может кто-то реализовывал вступление пользователя в группу, где, после вступления, пользователь и группа должны знать ID друг друга. Или, на крайний случай, перевод денег с одного аккаунта на другой аккаунт.

Очень важным является то, что инварианты никогда не должны быть нарушены, чтобы не было ни малейшего шанса на это.
Я имею в виду, что если, например, есть две транзакции: №1, в которой user1 предлагает дружбу и сохраняется, и №2, в которой user2 получает это предложение и тоже сохраняется, то нужно сделать так, чтобы между ними не выполнялись другие транзакции, которые могут повлиять на исход транзакции №2. То есть чтобы это было поочерёдно и в правильном порядке. Я не утверждаю, что так должно быть, я просто предполагаю. Возможно это не должно быть поочерёдно и в правильном порядке, может быть это может выполняться одновременно. Я не знаю.

Я надеюсь вы меня поняли.
Я очень хочу, чтобы наглядно всё было, чтобы я увидел, посмотрел и усвоил, ведь мне еще кучу всего нужно сделать, а на вещи, которые мне сейчас не нужны, время тратить не хочется (хотя я уже немало потратил).
  • Вопрос задан
  • 45 просмотров
Решения вопроса 1
sarapinit
@sarapinit
Точу водой камень
У Джимми Богарта в блоге есть серия постов по реализации распределенных транзакций. Можете начать с них.

https://jimmybogard.com/life-beyond-transactions-i...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы