Мы знакомы с транзакциями.Транзакции, о которых мы часто говорим, обычно относятся к автономным транзакциям, то есть к локальным транзакциям. Что такое распределенная транзакция?Распределенная транзакция — это транзакция, состоящая из нескольких локальных транзакций., который обычно появляется только в распределенных сценариях.
Например, на платформе электронной коммерции, когда мы совершаем покупки, кажется, что процесс размещения заказа и оплаты выполняется за один раз, но за этим может стоять разделение труда между несколькими системами. Система заказов, система оплаты, система логистики и т.д. Эти системы развернуты на разных серверах и выполняют различные транзакции, для платформ электронной коммерции это распределенная транзакция.
Локальные транзакции легко решаются, есть набор готовых механизмов транзакций, распределенные транзакции сложнее, чем локальные. Как реализовать распределенные транзакции? Есть примерно 3 решения:
- Протокол двухфазной фиксации XA на основе протокола.
- Протокол трехэтапной фиксации.
- Возможная согласованность на основе MQ.
Двухфазная фиксация на основе протокола XA
Протокол XA был впервые предложен Tuxedo и передан организации X/Open в качестве стандарта интерфейса для менеджеров ресурсов (баз данных) и менеджеров транзакций. В настоящее время основные производители баз данных, такие как Oracle, Informix, DB2 и Sybase, обеспечивают поддержку XA. ---- Источник Энциклопедия Baidu
двухэтапная фиксация2PC, Протокол двухэтапной фиксации. Во-первых, в двухфазном коммите есть две роли:
- участник: локальный менеджер ресурсов, то есть исполнитель транзакции, то есть каждой бизнес-системы.
- координатор: мозг распределенных транзакций, отвечающий за управление и координацию различных бизнес-систем для отправки/отката транзакций.
Так называемая двухфазная фиксация относится кГолосование и коммитЕсть два этапа, как и в избирательной системе: сначала нужно проголосовать, а потом принять решение.
стадия голосования, координатор инициирует запрос (запрос CanCommit) на выполнение операции транзакции к участнику и ожидает ответа участника.
После того, как участник примет запрос,Выполните операцию запроса транзакции, запишите информацию журнала, но не отправляйте ее. После успешной записи координатору будет отправлено сообщение «Да», указывающее, что операция отправки согласована. будет отправлено сообщение о том, что операция не согласована..注意这个过程会锁定数据。
Схема этапа голосования, вероятно, выглядит следующим образом:
этап фиксации, после того как координатор получит ответы от всех участников, он отправляет участникам запрос на фиксацию или откат в соответствии с полученной информацией.
-
Если все полученные ответные сообщения имеют значение «Да», отправьте участнику сообщение «DoCommit»., участник завершает другие операции локальной транзакции и освобождает ресурсы, а затем отправляет координатору сообщение «HaveCommitted»;
-
Если сообщение, полученное координатором, содержит сообщение «Нет» или нет ответа от участника в течение заданного времени, всем участникам отправляется сообщение «DoAbort»., участник, отправивший «Да», откатит операцию согласно журналу отката предыдущей операции, после чего все участники отправят координатору сообщение «HaveCommitted»;
Процесс этапа отправки примерно показан на следующем рисунке:
Протокол двухфазной фиксации прост для понимания.Алгоритм двухфазной фиксации, основанный на XA, удовлетворяет характеристикам ACID транзакции и выглядит идеально, но все еще имеет много недостатков.Основные проблемы заключаются в следующем:
- проблема блокировки синхронизации: во время выполнения двухфазной фиксации все участвующие узлы блокируют транзакции, участники блокируют данные, а другие посетители будут заблокированы, если они захотят получить доступ к данным.
- проблема единой точки отказа. В протоколе двухфазной фиксации есть только один координатор, и как только координатор отправит ошибку, вся система будет находиться в стагнационном состоянии. Особенно на этапе отправки, если координатор кладет трубку, участники всегда будут ждать ответа координатора и будут заблокированы.
- несогласованность данных: На этапе отправки, после того как координатор отправит участникам запрос DoCommit, из-за дрожания сети или сбоя координатора в процессе отправки запроса только часть участников получит запрос на отправку и выполнит операцию отправки. , а остальные нет Часть участников, получившая запрос на фиксацию, не может выполнить фиксацию транзакции. В результате возникает проблема несогласованности данных во всей распределенной системе.
трехэтапная фиксация
Протокол трехфазной фиксации (3PC) — это улучшение по сравнению с двухфазной фиксацией (2PC).. Решены некоторые проблемы с двухэтапными коммитами.Самая большая разница между трехэтапными и двухэтапными коммитами заключается в том, чтоВнедрить механизм тайм-аута и этап подготовки.
Сначала поговорим о механизме тайм-аута.При отправке второй фазы механизм тайм-аута есть только у координатора.Если координатор не получит ответа от участника в течение указанного времени, он отправит или прекратит всю транзакцию в соответствии с текущее состояние Если он зависает, у участников нет механизма тайм-аута, поэтому они продолжают ждать, что также является проблемой единой точки отказа второй фазы отправки. В трехэтапной фиксацииВнедрить механизм тайм-аута в координаторе и участнике одновременно. Если координатор или участник не получит ответа от других узлов в течение указанного времени, он решит отправить или завершить всю транзакцию в соответствии с текущим состоянием.
Трехэтапная фиксация фактически делит фазу фиксации в двухфазной фиксации на две Конкретные три фазы в протоколе трехфазной фиксации:CanCommit, PreCommit, DoCommitтри фазы
Стадия CanCommit, фаза CanCommit аналогична фазе голосования 2PC: координатор отправляет участнику операцию запроса (CanCommit request), спрашивает участника, может ли быть выполнена операция фиксации транзакции, и затем ожидает ответа участника; после получения участником на запрос CanCommit ответьте «Да», указав, что транзакция может быть выполнена гладко, в противном случае ответьте «Нет».
Этап предварительной фиксации, по сходству фазы фиксации в двухфазной фиксации, по результату, возвращаемому фазой CanCommit, чтобы решить, можно ли выполнить операцию PreCommit.
В это время возможны две ситуации, если все участникиОтветить "Да", то поток выполнения выглядит следующим образом:
- 1. Координатор отправляет запрос на предварительную фиксацию: Координатор отправляет участнику запрос PreCommit для входа в фазу предварительной фиксации.
- 2. Предварительная фиксация транзакции: участник выполняет операцию транзакции после получения запроса PreCommit и записывает информацию об отмене и повторении в журнале транзакций.
- 3. Отвечайте на отзывы: если участник успешно выполняет транзакционную операцию, он возвращает ответ ACK и начинает ждать последней инструкции.
если есть участникиВозвращает «Нет», либо координатор не получает ответ от участника в течение заданного времени, затем выполнитпрервать транзакциюработать. Процесс выглядит следующим образом:
- 1. Отправьте запрос на прерывание: Координатор отправляет сообщение «Прервать» всем участникам.
- 2. Прерывание транзакций: После того, как участник получил сообщение «Прервать» или не получил сообщение от координатора по истечении времени ожидания, транзакция прерывается.
Стадия DoCommit, В фазе реальной фиксации транзакции координатор решает, переходить ли к фазе фиксации или фазе прерывания транзакции в соответствии с информацией, возвращенной участниками в фазе предварительной фиксации.
этап фиксацииПроцесс выглядит следующим образом:
- 1. Отправьте запрос на отправку: Координатор получает ответы Ack, отправленные всеми участниками, переходит из состояния предварительной фиксации в состояние фиксации и отправляет сообщение DoCommit всем участникам.
- 2. Представление сделки: после того, как участник получает сообщение DoCommit, транзакция официально фиксируется. После фиксации транзакции освободите все заблокированные ресурсы.
- 3. Отвечайте на отзывы: после того, как участник отправит транзакцию, отправьте ответ Ack координатору.
- 4. Завершите бизнес: Координатор завершает транзакцию после получения ответов Ack от всех участников.
прерывание транзакциистадии процесс выглядит следующим образом:
- 1. Отправьте запрос на прерывание: Координатор отправляет всем участникам запросы ABORT.
- 2. Откат транзакции: после того как участник получает сообщение Abort, он использует информацию об отмене, записанную на этапе PreCommit, для выполнения операции отката транзакции и освобождения всех заблокированных ресурсов.
- 3. Результаты обратной связи: отправить сообщение Ack координатору после того, как участник завершит откат транзакции.
- 4. Прерывание транзакций: после того, как координатор получает сообщение Ack, возвращенное участником, он прерывает транзакцию и завершает транзакцию.
Схема окончательной согласованности на основе распределенных сообщений
Будь то двухэтапная фиксация или трехфазная фиксация, она строго непротиворечива и соответствует принципу ACID транзакции. Все они имеют две общие проблемы:
- 1. Необходимость блокировки данных, что снижает производительность системы.
- 2. По сетевым и другим причинам проблема непротиворечивости данных полностью не решена.
Распределенное решение, основанное на сообщениях MQ, не то же самое, оно используетНе сильная последовательность, а окончательная последовательность, которая является БАЗОВОЙ теорией. И у нас пока MQ асинхронный, поэтому производительность относительно быстрая, можно сказать, что проблемы, вызванные двумя вышеуказанными методами, прекрасно решены.
Идея решения распределенных транзакций на основе промежуточного программного обеспечения сообщений MQ заключается в следующем: в основном на основе надежности доставки сообщений MQ после того, как распределенная транзакция будет отправлена в промежуточное программное обеспечение MQ, промежуточное программное обеспечение сохранит транзакцию, что очень важно. чтобы сообщение не потерялось. Сторона потребителя потребляет асинхронно.В случае сбоя, поскольку наши сообщения являются постоянными, мы можем продолжать повторять попытки в соответствии с бизнес-правилами и, при необходимости, вручную компенсировать, чтобы обеспечить окончательную согласованность данных.
Что касается схемы возможной согласованности, основанной на распределенных сообщениях, я собираюсь открыть отдельную главу, основанную на RocketMQ, и подробно рассказать о ней, поэтому я не буду здесь много говорить.
Добро пожаловать в публичный аккаунт【Интернет плоский]. Обратите внимание на этого программиста, который борется за выживание в Интернете. Желаем вам и мне вместе добиться прогресса. Лучшее сегодня - это самые низкие требования завтра.