Исходя из того, что я понял о возможной согласованности, все эти службы (потребители) будут получать событие одновременно и обрабатывать их отдельно, что в хорошем сценарии приведет к согласованности данных.
Нет, не обязательно Как я уже говорил, мы не можем отменить отправленное письмо, поэтому нам все еще нужна своего рода «последовательность». IPC через управляемое событиями управление данными не освобождается от orchestation 1 .
Например, электронное письмо не следует отправлять, если предыдущие транзакции не были успешно завершены, а служба электронной почты получила подтверждение. 3
Однако, что если службе не удается обработать событие? например, внезапное отключение, ошибка базы данных и т. д. Что такое хороший метод / практика для обработки этих сбоев транзакций?
Скажите привет ошибкам распределенных вычислений . Это то, что усложняет ситуацию, и, как обычно, нет серебряных пуль, чтобы иметь с ними дело.
Прежде чем отправиться в путешествие в поисках Потерянного Ковчега, мы должны сначала спросить организацию. Часто решение состоит в том, как организация сталкивается с этими проблемами в реальном мире .
Что каждый (отделы) делает, когда определенные данные отсутствуют или неполны?
Мы поймем, что разные отделы имеют разные решения, которые, в целом, составляют решение, которое будет реализовано.
Во всяком случае, вот некоторые практики, которые могли бы помочь нам со стратегией для подражания.
Вместо того, чтобы постоянно гарантировать, что система находится в согласованном состоянии, мы можем согласиться с тем, что система получит ее в какой-то момент в будущем. Этот подход особенно полезен для долгоживущих деловых операций.
Способ достижения системой согласованности варьируется от системы к системе. Это может включать в себя от автоматизированных процессов до какого-то вмешательства человека. Например, типичная попытка повторить позже или контакт со службой поддержки .
Прервать все операции
Верните систему в согласованное состояние с помощью компенсирующих транзакций . Тем не менее, мы должны принять во внимание, что эти транзакции также могут потерпеть неудачу, что может привести нас к точке, в которой несоответствие еще сложнее решить. И, опять же, мы не можем отменить отправленное письмо.
Для небольшого количества транзакций такой подход возможен, потому что число компенсирующих транзакций также мало. Если бы в IPC участвовало несколько бизнес-транзакций, обработка одной компенсирующей транзакции для каждой из них была бы сложной задачей.
Если мы пойдем на компенсационные транзакции , мы найдем схему проектирования автоматического выключателя очень полезной - и обязательной, я бы осмелился сказать -
Распределенные транзакции
Идея состоит в том, чтобы охватить несколько транзакций в рамках одной транзакции посредством общего процесса управления, известного как Transaction Manager . Распространенным алгоритмом обработки распределенных транзакций является двухфазная фиксация .
Основная проблема распределенных транзакций заключается в том, что они полагаются на блокировку ресурсов в течение срока их службы, и, как мы знаем, что-то может пойти не так и для менеджера транзакций .
Если менеджеры транзакций будут скомпрометированы, мы можем получить несколько блокировок в разных контекстах, что приведет к неожиданному поведению из-за постановки сообщений в очередь. 2
Разложение операций. Зачем?
Если вы декомпозируете существующую систему и находите набор понятий, которые действительно хотят находиться в пределах одной транзакции, возможно, оставьте их до конца.
Сэм Ньюман
В соответствии с приведенными выше аргументами Сэм - в своей книге « Построение микросервисов» - заявляет, что, если мы действительно, действительно не можем позволить себе возможную последовательность, нам следует избегать разделения операции сейчас.
Если мы не можем позволить себе разделение определенных операций на две или более транзакций, то можно сказать, что, вероятно, эти транзакции относятся к одному и тому же ограниченному контексту или, по крайней мере, к сквозному контексту, который еще предстоит смоделировать.
Например, в нашем случае мы понимаем, что транзакции № 1 и № 2 тесно связаны друг с другом и, вероятно, обе они могут принадлежать к одному и тому же ограниченному контексту: учетные записи , пользователи , регистр , что угодно ...
Рассмотрите возможность размещения обеих операций в пределах одной транзакции. Это сделало бы всю операцию проще в обращении. Также весит уровень критичности каждой транзакции. Вероятно, в случае сбоя транзакции № 2 она не должна ставить под угрозу всю операцию. В случае сомнений обращайтесь в организацию .
1: Не тот тип оркестровки, как вы думаете. Я не говорю об оркестре ESB. Я говорю о том, чтобы заставить службы реагировать на соответствующее событие.
2: Вы могли бы найти интересные мнения Сэма Ньюмана относительно распределенных транзакций.
3: Проверьте ответ Дэвида Паркера относительно этой темы.