Mule Tcc 1.0 稳定版可使用
介绍
На основе Tcc распределённого протокола транзакций. Название проекта «Mule» (骡子) выбрано потому, что проект заимствует преимущества других проектов.
Использование учебника
Уже загружен в центральный репозиторий Maven:
<dependency>
<groupId>net.lulihu</groupId>
<artifactId>mule-tcc-springcloud</artifactId>
<version>1.0-RELEASE</version>
</dependency>
Версия Spring Cloud — 2.0.4.RELEASE, о совместимости с другими версиями неизвестно.
Внимание: команда Linux kill -9 может привести к потере транзакции. Рекомендуется использовать команду kill -15, чтобы операционная система уведомила JVM о необходимости самостоятельного закрытия (ожидание завершения выполнения текущей транзакции перед закрытием).
Способ использования
Используйте аннотацию MuleTcc для методов, требующих подтверждения или отката транзакции.
Параметры аннотации MuleTcc:
- confirmMethod() default ""; определяет метод подтверждения транзакции. Если транзакция выполнена успешно, уведомляет все методы о выполнении подтверждения транзакции (можно не устанавливать, если не требуется выполнять).
- cancelMethod() default ""; определяет метод отмены транзакции. Если транзакция завершается неудачно, уведомляет все методы об отмене транзакции (можно не устанавливать).
- currentMethod() default false; определяет, должен ли текущий метод выполняться при подтверждении или отмене транзакции (по умолчанию не выполняется). Когда этот параметр установлен в true, параметры confirmMethod() и cancelMethod() становятся недействительными.
- exceptionNotRollBack() default true; определяет, следует ли откатывать транзакцию при возникновении ошибки во время выполнения (по умолчанию true, откат не производится, обратите внимание: этот атрибут действует только для методов Rpc).
В настоящее время подтверждение или отмена транзакции поддерживаются только в текущем классе или родительском классе текущего класса.
Как показано на рисунке:
Параметры метода транзакции могут быть необязательными и соответствовать параметрам целевого метода или быть без параметров, поскольку выполнение метода транзакции осуществляется по имени метода.
Использование обычных методов транзакции:

Использование методов Rpc транзакции:

Анализ конфигурации параметров
- mule-tcc
- applicationName — имя приложения, используется для создания префикса записи транзакции (необходимо установить, иначе запуск завершится ошибкой).
- serializer — выбор сериализатора. Доступные параметры: [kryo, jdk] (подробности см. в объекте SerializeEnum).
- scheduledThreadMax — максимальное количество потоков для самовосстановления программы, по умолчанию два потока для процессоров с более чем 4 ядрами, один поток для остальных.
- scheduledDelay — интервал планирования для программы самовосстановления, единица измерения — секунды.
- scheduledInitDelay — задержка начального выполнения программы самовосстановления, единица измерения — секунды.
- retryMax — максимальное число попыток для отправки или отмены транзакции.
- recoverTimeInterval — минимальный интервал времени для повторной попытки, единица измерения — секунды (реальное время повторной попытки должно быть больше или равно этому значению).
- firstRecoveryTimeInterval — задержка первого восстановления транзакции, единица измерения — секунды.
- deleteExcessCompensationRecordInitialDelay — начальная задержка удаления избыточных записей компенсации, единица измерения — секунды.
- bufferSize — размер буфера асинхронного пула потоков (степень двойки).
- consumerThreadNum — количество потребителей асинхронного пула потоков, по умолчанию равно количеству ядер процессора минус один.
- repositorySupport — поддержка хранилища транзакционных записей. Доступные параметры: db (подробности см. в RepositorySupportEnum).
- dbConfig — конфигурация базы данных, когда хранилище записей транзакций — db (использует HikariCP в качестве пула соединений с базой данных):
- driverClassName — полное имя класса драйвера.
- url — адрес базы данных.
- username — учётная запись.
- password — пароль.
- maxActive — максимальное активное соединение (подробнее см.: https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing).
- minIdle — минимальное активное соединение.
- connectionTimeout — максимальное время ожидания соединения в пуле соединений с базой данных в миллисекундах.
- idleTimeout — максимальный период простоя соединения в пуле соединений с базой данных.
- maxLifetime — максимальный срок жизни соединения в пуле соединений с базой данных.
- successCode — код состояния успеха запроса, необходимо учитывать при обработке транзакции как запрос (по умолчанию 200, это набор, который может принимать несколько значений).
Примечание:
- Параметр successCode: например, вы используете springboot для перехвата всех исключений, что может привести к тому, что транзакция будет считаться успешной и выполнит метод подтверждения транзакции. Вы можете настроить код состояния HTTP для определения выполнения метода отправки или отмены транзакции (после перехвата исключения верните код состояния текущего запроса, чтобы программа могла определить). Этот атрибут является специфическим параметром компонента интеграции mule-tcc-springcloud.
Для тех, кто использует не spring cloud, можно обратиться к компоненту mule-tcc-springcloud для интеграции. mule-tcc-transaction является основным компонентом, независимым от других фреймворков, и простой способ использования можно увидеть в демо-компоненте helloword.
Состав компонентов
- ComponentService — интерфейс верхнего уровня компонента.
- MuleTccBootService — сервис быстрого запуска компонента.
- MuleTccShutdownService — служба закрытия компонента (зарегистрированные компоненты будут закрыты в указанном порядке).
- TransactionSupportService — компонент выбора службы (аналогично интерфейсу параметров обработки spring).
- TransactionCoordinatorService — координатор транзакций службы (координация событий, связанных с транзакциями).
- TransactionCoordinatorRepositoryService — репозиторий координатора транзакций (предоставление методов для приземления транзакционных записей).
- TransactionExecutorEventService — служба событий выполнения транзакций (предоставляет методы для транзакционного обработчика).
- TransactionHandlerService — обработчик транзакций (обработка различных контекстов транзакций).
- TransactionMethodProxyService — прокси-служба транзакционных методов (для предотвращения загрязнения кода, при интеграции необходимо использовать эту службу для обёртывания уведомлений о прокси-методах).
- MuleTccTransactionSelfHealingProgram — программа самовосстановления транзакций (многократные попытки для решения случайных проблем, таких как колебания сети).
UML-диаграмма
См. рисунок ниже.
Механизм TCC
Try: резервирование бизнес-ресурсов.
Confirm: подтверждение выполнения бизнес-операции. Отмена выполнения бизнес-операции
Если немного сравнить три операции с реляционной базой данных: DML, Commit и Rollback, то можно обнаружить удивительное сходство с TCC.
В бизнес-операциях, которые охватывают несколько приложений,
- операция Try сначала резервирует и блокирует бизнес-ресурсы в нескольких приложениях для последующего подтверждения. Аналогично, операция DML блокирует строки записей базы данных и удерживает ресурсы базы данных;
- операция Confirm выполняется после успешного завершения всех операций Try в участвующих приложениях. Она использует зарезервированные бизнес-ресурсы аналогично операции Commit;
- операция Cancel используется, когда не все приложения успешно завершили операцию Try. В этом случае необходимо отменить (откатить) успешные операции.
Операции Confirm и Cancel являются обратными друг другу.
Короче говоря, если рассматривать приложение как менеджер ресурсов, то TCC — это двухфазная фиксация на уровне приложения (2PC).
Для каждой операции TCC необходимо выполнить следующие действия:
-
Try: попытаться выполнить бизнес-процесс.
- Выполнить все проверки бизнеса (согласованность);
- Зарезервировать необходимые бизнес-ресурсы (предварительная изоляция).
-
Confirm: подтвердить выполнение бизнес-процесса.
- Действительно выполнить бизнес-процесс;
- Не выполнять никаких проверок бизнеса;
- Использовать только зарезервированные бизнес-ресурсы на этапе Try.
-
Cancel: отменить выполнение бизнес-процесса.
- Освободить зарезервированные бизнес-ресурсы этапа Try.
Все участники транзакции TCC включают три части:
-
Основной бизнес-сервис: основной бизнес-сервис инициирует всю бизнес-активность, например, платёжная система в сценарии комбинированной оплаты.
-
Бизнес-сервис: бизнес-сервисы отвечают за предоставление операций TCC и являются операционными сторонами всей бизнес-деятельности. Они должны реализовывать три интерфейса: Try, Confirm и Cancel, чтобы основной бизнес-сервис мог их вызывать. Поскольку Confirm и Cancel могут вызываться повторно, эти два интерфейса должны быть идемпотентными. Например, системы остатков и красных пакетов в сценарии комбинированной оплаты являются бизнес-сервисами.
-
Менеджер бизнес-процессов: менеджер бизнес-процессов управляет и контролирует весь бизнес-процесс, включая запись и поддержание состояния транзакции TCC, а также состояния подтранзакций каждого бизнес-сервиса. Он подтверждает все операции типа Confirm при фиксации бизнес-процесса и вызывает все операции типа Cancel при отмене бизнес-процесса.
Таким образом, вся транзакция TCC прозрачна для основного бизнес-сервиса, и менеджер бизнес-процессов и бизнес-сервисы выполняют свою часть работы.
Преимущества и ограничения TCC
Преимущества транзакций TCC:
- Решают проблему атомарности межприкладных бизнес-операций, что особенно полезно в таких сценариях, как комбинированная оплата и разделение счетов.
- Фактически переносят двухэтапную фиксацию на уровне базы данных на уровень приложения, делая её одноэтапной фиксацией для базы данных, избегая проблем с производительностью, связанных с 2PC на уровне базы данных.
Недостатки транзакций TCC заключаются в том, что функции операций Try, Confirm и Cancel должны предоставляться бизнесом, что увеличивает стоимость разработки.
Комментарии ( 0 )