Проблема распределенных транзакций всегда была сложной проблемой в микросервисной архитектуре. Одно приложение может реализовывать локальные транзакции, но в распределенной среде ситуация усложняется. Запрос может включать несколько служб, и между восходящим и нисходящим потоками существуют зависимости.Если одна из ссылок выходит из строя, необходимо откатить всю транзакцию. В первой половине прошлого года автор открыл исходный код компонента распределенных транзакций микросервиса:lottorГибкая схема реализации распределенных транзакций на основе надежных сообщений. Представленный клиент Lottor более сложный и инвазивный для бизнеса. Эффект от поощрения использования не очень хороший. Али открыл SEATA (оригинальный FESCAR) в начале этого года, что вызвало бурный отклик. Недавно автор задумал улучшить Lottor, научиться практиковать сита и поделиться этим с вами.
Несколько компонентов распределенных транзакций с открытым исходным кодом
Существующие решения для распределенных транзакций делятся на две категории в зависимости от вторжения в бизнес, а именно: неинтрузивные для бизнеса и интрузивные для бизнеса.
Ненавязчивое решение для бизнеса
Среди существующих основных решений для распределенных транзакций только решения на основе XA ненавязчивы для бизнеса (Примечание: JTA, упомянутый в вопросе, является Java-версией решения XA), но при применении решения XA возникают три проблемы:
-
База данных требуется для обеспечения поддержки XA. Если вы столкнулись с базой данных, которая не поддерживает XA (или поддерживает ее плохо, например версии MySQL до 5.7), ее нельзя использовать.
-
Ограниченные самим протоколом ресурсы транзакций (записи данных, соединения с базой данных) имеют длительный период блокировки. С точки зрения бизнеса долгосрочная блокировка ресурсов часто не нужна, а поскольку управляющим ресурсами транзакций является сама база данных, прикладной уровень не может вмешиваться. В результате приложения на основе XA, как правило, имеют низкую производительность и их трудно оптимизировать.
-
Реализованные распределенные решения на основе XA полагаются на тяжеловесные серверы приложений (Tuxedo/WebLogic/WebSphere и т. д.), которые не подходят для микросервисной архитектуры.
Деловая программа проникновения
Фактически единственным решением для распределенных транзакций поначалу был XA. XA завершена, но на практике по разным причинам (включая, но не ограничиваясь 3 пунктами, упомянутыми выше) часто приходится сдаваться и обращаться к бизнес-уровню для решения проблемы распределенных транзакций. Например:
- Схема возможной согласованности на основе надежных сообщений
- TCC
- Saga
попасть в эту категорию. Конкретные механизмы этих схем здесь раскрывать не буду, а статей на эту тему в интернете много. Одним словом, все эти решения требуют, чтобы ограничения технологии распределенных транзакций учитывались при проектировании на бизнес-уровне приложения.Обычно каждая служба должна быть спроектирована для реализации прямых и обратных идемпотентных интерфейсов. Такие конструктивные ограничения часто приводят к высоким затратам на НИОКР и техническое обслуживание.
Бесспорно, решения для распределенных транзакций, вторгающиеся в бизнес, проверены большой практикой, могут эффективно решить проблему и играют важную роль в системах бизнес-приложений различных отраслей. Но вернемся к исходной точке зрения: принятие этих программ фактически вынужденное.
Представляем Сеата
SeataЭто решение для распределенных транзакций с открытым исходным кодом, которое обеспечивает высокую производительность и простые в использовании службы распределенных транзакций.
Он включает в себя TXC группы (облачная версия называется GTS) и TCC Ant Financial.В настоящее время количество звезд на Github превысило 10 000, что делает его единственным решением для распределенных транзакций, одобренным крупными производителями. TXC также называется режимом AT в Seata, что означает, что метод компенсации автоматически генерируется фреймворком, который полностью экранирован для пользователей. Пользователи могут использовать распределенные транзакции, как и с использованием локальных транзакций. Недостатком является то, что только реляционные базы данных (в настоящее время MySQL поддерживаются). Для службы Seata AT требуется локальная таблица для хранения rollback_info, а уровень изоляции RU по умолчанию применим к ограниченным сценариям.
TCC - это не новая концепция. Это было в течение длительного времени. Пользователь имитает двухступенчатую представление на уровне приложения, определив три метода: попробуйте / подтвердить / отменить. Разница в том, что метод TRY в TCC также должен Управляйте базу данных, чтобы заблокировать ресурсы. Следующие две методы компенсации он автоматически вызывается в рамках для выполнения подачи ресурсов и отката соответственно, что отличается от простого слоя 2 шт. Ant Financial предоставляет свою собственную реализацию TCC в SACA, который, как говорят, развивались более десяти лет и широко используются в финансах, торгах, складировании и других областях.
Эта статья в настоящее время посвящена режиму AT в Seata.
Состав Seata
С точки зрения дизайна, Seata делит все на три основных модуля, а именно TM, RM и TC, Конкретные объяснения заключаются в следующем:
-
TM (менеджер транзакций): диспетчер глобальных транзакций, который управляет границей глобальной транзакции и отвечает за открытие глобальной транзакции, глобальную фиксацию и глобальный откат.
-
RM (менеджер ресурсов): менеджер ресурсов, контролирует транзакции филиалов, отвечает за регистрацию филиалов, отчеты о состоянии и получает инструкции от координатора транзакций для управления фиксацией и откатом транзакций филиала (локальных).
-
TC (координатор транзакций): координатор транзакций, поддерживает рабочее состояние глобальных транзакций, отвечает за координацию и управление фиксацией или откатом глобальных транзакций.
Режим Seata AT разработан на основе режима двухэтапной фиксации и решает проблемы распределенных транзакций, возникающие в сценарии микросервиса, эффективным и неинтрузивным способом.
Введение в архитектуру и принципы реализации режима AT
Распределенная транзакция — это глобальная транзакция, состоящая из нескольких транзакций филиалов.Режим Seata AT включает в себя следующие два этапа:
- Фаза 1: Выполнение транзакций филиала (локально). Локальная транзакция используется как ветка распределенной транзакции, поэтому несколько локальных транзакций, распределенных по разным микросервисам, вместе образуют глобальную транзакцию, структура ее следующая.
- Фаза 2: транзакция ветки фиксируется или откатывается. Фаза 2 завершает окончательную фиксацию или откат глобальной транзакции. Когда все транзакции ветвей в глобальной транзакции завершены и выполнены успешно, TM инициирует фиксацию глобальной транзакции. После того, как TC получит сообщение о фиксации глобальной транзакции, он уведомит каждую Транзакция ответвления фиксируется; аналогичным образом, когда все транзакции ответвления в глобальной транзакции завершаются, а транзакция ответвления терпит неудачу, TM уведомляет TC о необходимости координировать откат глобальной транзакции, а затем TC уведомляет каждую транзакцию о переходе к откату. назад.
В процессе запуска бизнес-приложения, благодаря внедрению клиента Seata, RmRpcClient будет запущен вместе с приложением. RmRpcClient реализован в Netty и может получать сообщения TC и отправлять сообщения TC. Поэтому RmRpcClient ключевой модуль для отправки и получения сообщений с ТС.
Общий процесс реализации распределенных транзакций в Seata выглядит следующим образом:
- TM уведомляет TC о начале новой глобальной транзакции. TC генерирует XID, представляющий глобальную транзакцию.
- XID распространяется по цепочке вызовов микрослужбы.
- RM регистрирует локальную транзакцию как ответвление соответствующей глобальной транзакции XID для TC.
- TM уведомляет TC о необходимости фиксации или отката глобальной транзакции, соответствующей XID.
- TC управляет всеми транзакциями ветвей в соответствии с соответствующей глобальной транзакцией XID для завершения фиксации или отката ветвления.
Начало работы с режимом Seata AT
Пример использованияseata-samplesПроект Seata-JPA в формате .
Задействованные услуги следующие:
Клиент инициирует бизнес-службы, а Business вызывает Storage для блокировки запасов и Order для создания заказов. Заказ вызывает Аккаунт для вычета баланса. Роли, соответствующие каждой службе, отмечены на рисунке выше.
Запустить службу ТС
Во-первых, мы запускаем SEATA-Server, а именно TC. Скачать пакет релиз Seata-Server. Запустите следующую команду, чтобы запустить сервер.
sh distribution/bin/seata-server.sh -p 8091 -h 127.0.0.1 -m file
Новая таблица базы данных
Таблицы базы данных, участвующие в выполнении нескольких сервисов:
У каждой службы есть соответствующая бизнес-таблица и таблица undo_log.
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
`ext` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Создайте новую таблицу undo_log в базе данных служб, участвующих в цепочке транзакций, для хранения информации UndoLog для двухэтапной операции отката.Таблица содержит информацию о ключевых полях, такую как xid, branchId и rollback_info.
Добавить глобальные аннотации транзакций
@GlobalTransactional
public void purchase(String userId, String commodityCode, int orderCount) {
storageFeignClient.deduct(commodityCode, orderCount);
orderFeignClient.create(userId, commodityCode, orderCount);
}
Положитесь на клиентский SDK Seata, а затем добавьте его в бизнес-метод всего инициатора распределенной транзакции.@GlobalTransactional
аннотация.
Настройка прокси-источника данных
Seata в основном переупаковывает четыре интерфейса DataSource, Connection, Statement и PreparedStatement в пакет java.sql. Классы упаковки: DataSourceProxy, ConnectionProxy, StatementProxy, PreparedStatementProxy, которые очень хорошо печатают один к одному. Его функция находится в пакете java.sql. Оператор SQL.Некоторые операции, связанные с распределенными транзакциями Seata, выполняются до и после выполнения, фиксации или отката транзакции, например регистрация ветки, отчет о состоянии, запрос глобальной блокировки, хранение моментальных снимков, обратное генерирование SQL и т. д.
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DruidDataSource druidDataSource() {
return new DruidDataSource();
}
@Primary
@Bean("dataSource")
public DataSource dataSource(DruidDataSource druidDataSource) {
return new DataSourceProxy(druidDataSource);
}
}
DataSourceProxy должен быть установлен в качестве основного источника данных, иначе транзакцию нельзя будет откатить.
проверять
В бизнес-сервисе предусмотрено два интерфейса, один отправляется нормально, другой откатывается, а результат можно посмотреть после выполнения.
GET http://127.0.0.1:8084/purchase/commit
Accept: application/json
###
GET http://127.0.0.1:8084/purchase/rollback
Accept: application/json
Вы можете проверить результат самостоятельно.
резюме
В этой статье кратко вводит концепцию распределенной транзакции с открытым исходным кодом ALI SEATA, фокусируясь на режиме SEATA, MT, MT будет описан позже. Эта статья относительно проста, является входной практикой. SEATA - это отличная рамка для распределенной транзакции, я сочетую в более поздней статье описывает реализацию принципа источника SACA.