Я думаю, что это довольно распространенный вопрос: как поместить мою бизнес-логику в глобальную транзакцию в среде распределенных систем? Приведите пример, у меня есть TaskA, содержащая пары подзадач:
TaskA {подзадача1, подзадача2, подзадача3 ...}
каждая из этих подзадач может выполняться на локальной или удаленной машине, я надеюсь, что TaskA выполняется атомарным образом (успешно или неудачно) посредством транзакции. У каждой подзадачи есть функция отката. Когда TaskA считает, что операция не выполнена (из-за сбоя одной из подзадач), она вызывает каждую функцию отката подзадач. В противном случае TaskA фиксирует всю транзакцию.
Чтобы сделать это, я следую шаблону транзакции «Аудит пробной версии», чтобы получить запись для каждой подзадачи, чтобы TaskA могла узнать результаты работы подзадач, а затем принять решение об откате или принятии. Это звучит просто, однако, сложная часть состоит в том, как связать каждую подзадачу с глобальной транзакцией?
Когда запускается TaskA, запускается глобальная транзакция, о которой подзадача ничего не знает. Чтобы осознать подзадачу, я должен передать контекст транзакции каждому вызову подзадачи. Это действительно ужасно! Моя подзадача может либо выполняться в новом потоке, либо выполняться удаленно, отправляя сообщение через брокера AMQP, сложно консолидировать способ распространения контекста.
Я провел несколько исследований, таких как «Шаблоны транзакций - набор из четырех шаблонов, связанных с транзакциями», «Проверенные транзакции в среде асинхронной передачи сообщений», но ни одна из них не решила мою проблему. У них либо нет практического примера, либо они не решают проблему распространения контекста.
Интересно, как люди решают это? так как такого рода транзакции должны быть распространены в программном обеспечении предприятия.
Является ли X / Open XA единственным решением для этого? Может ли здесь помочь JTA (я не изучал JTA, так как большинство вещей, связанных с ним, связано с транзакцией базы данных, и я использую Spring, я не хочу подключать к своему программному обеспечению еще один сервер приложений Java EE).
Может ли какой-нибудь эксперт поделиться со мной своими мыслями? спасибо.
Заключение
Арджан и Мартин дали действительно хорошие ответы, спасибо.
Наконец, я не пошел по этому пути. После дополнительных исследований я выбрал другой шаблон " CheckPoint " 1 .
Изучив мое требование, я обнаружил, что намерение «Аудит шаблона пробной транзакции» состоит в том, чтобы узнать, к какому уровню была достигнута операция, и если она не удалась, я могу перезапустить ее в точке сбоя после перезагрузки некоторого контекста. На самом деле это не транзакция, она не откатила другие успешные шаги после сбоя. Это суть паттерна CheckPoint.
Тем не менее, изучение распределенных транзакций заставляет меня узнать много интересного. Помимо того, что упоминали Арджан и Мартин. Я также предлагаю людям, копающимся в этой области, взглянуть на CORBA, который является известным протоколом для распределенной системы.