1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/yangdechao_admin-guage-notes

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
09-分布式事务总结.md 62 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 24.06.2025 02:12 0782333

1. Основные теории распределённых транзакций

Распределённые транзакции обычно следуют теории CPA, используя мягкие характеристики транзакций, такие как мягкое состояние или конечная согласованность, чтобы обеспечить согласованность распределённых транзакций.

2. Часто используемые решения для распределённых транзакций

  1. 2PC (двухфазный протокол коммита)
  2. 3PC (трёхфазный протокол коммита) (предназначен для устранения недостатков двухфазного протокола коммита)
  3. TCC или GTS (Али), TCC — это компенсирующая схема двухфазного коммита
  4. Конечная согласованность с использованием промежуточного программного обеспечения для сообщений
  5. Использование LCN для решения распределённых транзакций, идея заключается в том, что "LCN не создаёт транзакции, LCN просто перемещает локальные транзакции".

3. Ключевые понятия и различия между 2PC, 3PC и TCC распределёнными транзакциями

1. 2PC (двухфазный коммит)

  • Понятие: Двухфазный протокол коммита представляет собой решение для распределённых транзакций с сильной согласованностью. Он состоит из подготовительной фазы (Prepare) и фазы коммита (Commit). Управление транзакциями (TM) координирует несколько менеджеров ресурсов (RM), спрашивая всех RM, могут ли они подтвердить транзакцию. Если все RM согласны, то транзакция подтверждается, в противном случае она откатывается. - Недостатки: Существует проблема одиночной точки отказа (TM отказывает, что блокирует всю транзакцию), низкая производительность, возможна длительная блокировка ресурсов.
    • Состояние блокировки: В протоколе 2PC блокировка удерживается во время подготовительной фазы, а затем освобождается во время фазы коммита (независимо от того, происходит ли коммит или откат). Эта система блокировок, хотя и гарантирует сильную согласованность данных, также имеет свои недостатки, такие как возможность длительной блокировки ресурсов, снижающей параллелизм системы, а также возможность постоянной блокировки ресурсов при отказе TM.

    Подготовительная фаза (Prepare Phase)

    • Удержание блокировки: Во время подготовительной фазы управление транзакциями (TM) отправляет запрос на подготовку всем менеджерам ресурсов (RM). Когда RM получает запрос, он выполняет операцию транзакции и блокирует соответствующие ресурсы. Это делается для обеспечения того, что другие транзакции не смогут изменять эти ресурсы до завершения последующих операций коммита или отката, тем самым обеспечивая согласованность данных. Например, при работе с базой данных RM может заблокировать таблицы или строки, используемые в транзакции.
    • Пример кода: В Java при использовании JDBC для имитации работы с базой данных подготовительная фаза может выглядеть так:
      import java.sql.Connection;
      import java.sql.Statement;
      import java.sql.PreparedStatement;
      import java.sql.ResultSet;
      ``````sql

DriverManager; import java.sql.SQLException; import java.sql.Statement;

        private Connection connection;

        public ResourceManagerExample() {
            try {
                // Предположим, что это данные для подключения к базе данных
                connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password");
    ```### Этап подтверждения (Commit Phase)
- **Освобождение блокировок**: Если все RM возвращают "готово" на этапе подготовки, то TM отправляет запрос на подтверждение всем RM. RM, получив запрос на подтверждение, завершает транзакцию и освобождает ранее захваченные блокировки, позволяя другим транзакциям работать с этими ресурсами. Если на этапе подготовки хотя бы одно RM возвращает "не готово", то TM отправляет запрос на откат всем RM, и RM также освобождают блокировки.
- **Пример кода**: Продолжая вышеупомянутый код, этап подтверждения и отката представлен ниже:
```java
public void commit() {
    try {
        connection.commit();
        // Подтверждение транзакции, освобождение блокировок
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
``````java
public void rollback() {
    try {
        connection.rollback();
        // Rollback transaction, release locks
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

В целом, протокол 2PC удерживает блокировки на этапе подготовки и освобождает их на этапе подтверждения (независимо от того, происходит ли подтверждение или откат). Такое блокировочное механизм гарантирует сильную согласованность данных, но также имеет свои недостатки, такие как возможность длительной блокировки ресурсов, снижающая производительность параллелизма системы, а также возможное постоянное удержание ресурсов при отказе TM.

 - **Концепция**: На основе 2PC добавлен этап запроса (CanCommit), который уменьшает время удержания ресурсов. На этапе запроса TM спрашивает RM, могут ли они выполнить транзакцию, если все могут, то переходят к этапу подготовки, а затем выполняют подтверждение.
 - **Преимущества**: В некоторой степени решает проблемы однопунктного отказа и длительной блокировки ресурсов в 2PC.
 - **Недостатки**: Все еще не полностью решает проблему несогласованности данных.
 - **Трифазный процесс выполнения**
     В трехфазной схеме подтверждения (3PC) протоколе, **локи удерживаются в фазе PreCommit, а освобождаются в фазе DoCommit или при возникновении ошибок и откате**. Далее приведено подробное объяснение:
     - **Фаза CanCommit**: Координатор отправляет запрос CanCommit участникам, чтобы узнать, могут ли они выполнить транзакцию. Участники в этой фазе проверяют доступность своих ресурсов и выполнение предварительных условий транзакции, например, проверяют, работает ли соединение с базой данных, удовлетворены ли требования к данным и т. д., но не блокируют ресурсы.
     - **Фаза PreCommit**: Если все участники ответили положительно на запрос CanCommit, координатор отправляет участникам запрос PreCommit. Участники, получив этот запрос, выполняют транзакционные операции, записывают информацию для отката (undo) и повторного выполнения (redo) в журнал транзакций и блокируют связанные ресурсы.Это делается для обеспечения согласованности и целостности данных при последующей фазе DoCommit, если транзакция будет завершена.
    - **Фаза DoCommit**: Когда координатор получает положительные ответы от всех участников на запрос PreCommit и нет ошибок, он отправляет участникам запрос DoCommit. Участники, получив запрос DoCommit, завершают транзакцию и освобождают ранее заблокированные ресурсы. Если после фазы PreCommit возникают ошибки, такие как отказ координатора, сетевые проблемы или ошибки у некоторых участников, координатор отправляет запрос Abort. Участники, получив запрос Abort, выполняют откат, используя информацию для отката, и освобождают заблокированные ресурсы.
     В отличие от двухфазной схемы подтверждения (2PC), 3PC вводит фазу CanCommit, что позволяет участникам провести начальную проверку и подготовку до блокировки ресурсов, тем самым уменьшая время блокировки ресурсов и повышая параллелизм системы и её способность к отказоустойчивости. Кроме того, 3PC вводит таймауты для координатора и участников, что предотвращает ситуацию, когда участники продолжают удерживать локи в ожидании команд от координатора.
   - Какая фаза удерживает локи, а какая освобождает их
     В трёхфазной схеме подтверждения (3PC) протоколе, **время удержания и освобождения локов** тесно связано с фазами протокола, что представлено ниже:
     ---
     ### **1. Фаза CanCommit (фаза запроса)**   - **Состояние локов**: **локи не удерживаются**.
    - **Действия**:  
      Координатор запрашивает у участников возможность выполнения транзакции. Участники проводят **проверку возможности** (например, достаточно ли средств, доступны ли ресурсы), но **не блокируют ресурсы**.
      **Цель**: избежать преждевременной блокировки ресурсов, которая может вызвать блокировку других транзакций, и повысить параллелизм системы.
     ---## Предкоммитная стадия
    - **Состояние блокировки**: **Начало удержания блока**.
    - **Действие**:
      Если все участники согласны на коммит (через стадию CanCommit), координатор отправляет запрос `PreCommit`. Участники на этой стадии **блокируют связанные ресурсы** (например, замораживают средства на счетах) и вычисляют временное состояние (например, предварительное списание или предварительное зачисление).
      **Цель**: обеспечить изоляцию транзакций, предотвратить изменения ресурсов другими транзакциями после предкоммита.
     ---
     ### **3.  Стадия коммита**
    - **Состояние блокировки**: **Освобождение блока**.
    - **Действие**:
      Координатор отправляет запрос `DoCommit`, участники фиксируют временное состояние предкоммита (например, обновляют фактический баланс) и **освобождают блок**.
      **Цель**: завершить атомарный коммит транзакции, освободить ресурсы для других транзакций.
     ---
     ### **Ключевые различия от  Yöntem 2PC**
     ---
     ### **Ключевые различия от 2PC**   В **2PC** блок удерживается на стадии `Prepare` (аналогично стадии `PreCommit` в  Yöntem 3), до тех пор пока транзакция не будет подтверждена или отменена. Если координатор выходит из строя, участники могут **заблокироваться длительное время** (блокировка не может быть освобождена).
    В **3PC**:
    1. Через стадию `CanCommit` избегаются бесполезные блокировки.
    2. На стадии `PreCommit` ресурсы блокируются, но через механизм таймаута (например, если координатор выходит из строя, участники автоматически выходят из состояния таймаута и прекращают выполнение), **время удержания блокировки сокращается**, снижается риск блокировки.
     ---
     ### **Пример сценария (перевод денег между банками)**
    1. **Стадия CanCommit**:
       - Проверка баланса счета Петра ≥ 500 рублей, действительности счета Ивана.
       - **Счета не блокируются**, другие транзакции могут читать и писать на счетах.
     2. **Стадия PreCommit**:
       - Блокировка счетов Петра и Ивана, вычисление временного баланса (Петр: 500, Иван: 1500).
       - **Другие транзакции не могут изменять эти два счета**.
     3. **Стадия DoCommit**:
       - Обновление фактического баланса, освобождение блока.
       - **Счета восстанавливаются в доступном состоянии**.
     ---
     ### **Заключение**
    - **Стадия удержания блока**: **Стадия PreCommit** (блокировка ресурсов, обеспечение изоляции).

---

Перевод:

   В **2PC** блок удерживается на стадии `Prepare` (аналогично стадии `PreCommit` в 3PC), до тех пор пока транзакция не будет подтверждена или отменена. Если координатор выходит из строя, участники могут **заблокироваться длительное время** (блокировка не может быть освобождена).
    В **3PC**:
    1. Через стадию `CanCommit` избегаются бесполезные блокировки.
    2. На стадии `PreCommit` ресурсы блокируются, но через механизм таймаута (например, если координатор выходит из строя, участники автоматически выходят из состояния таймаута и прекращают выполнение), **время удержания блокировки сокращается**, снижается риск блокировки.
     ---
     ### **Пример сценария (перевод денег между банками)**
    1. **Стадия CanCommit**:
       - Проверка баланса счета Петра ≥ 500 рублей, действительности счета Ивана.
       - **Счета не блокируются**, другие транзакции могут читать и писать на счетах.
     2. **Стадия PreCommit**:
       - Блокировка счетов Петра и Ивана, вычисление временного баланса (Петр: 500, Иван: 1500).
       - **Другие транзакции не могут изменять эти два счета**.
     3. **Стадия DoCommit**:
       - Обновление фактического баланса, освобождение блока.
       - **Счета восстанавливаются в доступном состоянии**.
     ---
     ### **Заключение**
    - **Стадия удержания блока**: **Стадия PreCommit** (блокировка ресурсов, обеспечение изоляции).   - **Время освобождения блока**: **Стадия DoCommit** (освобождение блока после коммита или автоматическое освобождение при таймауте).
    - **Преимущества**: благодаря фазовому управлению блокировками сокращается время удержания ресурсов, повышается параллелизм системы и её отказоустойчивость.
   ### 3.  TCC (Try - Confirm - Cancel)
   - **Концепция**: это решение для распределённых транзакций уровня приложения, которое делит транзакцию на три этапа.  Этап Try выполняет проверку бизнеса и резервирование ресурсов; этап Confirm выполняет реальные операции бизнеса; этап Cancel выполняет освобождение ресурсов при неудаче Try или Confirm.
   - **Преимущества**: высокая производительность, возможность кастомизации по бизнесу, подходящее для сложных бизнес-сценариев.
   - **Недостатки**: высокий уровень вторжения в код, высокие затраты на разработку.
   - **Удержание и освобождение блокировки**
     В **режиме TCC (Try-Confirm-Cancel)** логика удержания и освобождения блокировки отличается от традиционной блокировки базы данных.  Это достигается за счёт резервирования ресурсов на уровне бизнес-логики (например, заморозка суммы).  Ниже приведены детали механизма блокировки на каждом этапе TCC:
     ------
     ### **1.  Этап Try (резервация ресурсов)**
     - **Состояние блокировки**: **Уровнем бизнес-логики удерживается "логическая блокировка"** (через заморозку ресурсов).
     - **Действия**:      На этапе Try участники (например, счета) замораживают ресурсы (например, сумму перевода), чтобы гарантировать, что другие транзакции не смогут использовать этот ресурс.
       - **Счет Петра**: Заморозка 500 рублей (`balance -= 500`, `frozen += 500`).
       - **Счет Ивана**: Резервирование приема 500 рублей (через отрицательную заморозку, например, `frozen -= 500`).
     - **Цель**: 
       Гарантия изоляции ресурсов через бизнес-логику (а не через блокировки базы данных), чтобы избежать грязного чтения или параллельных изменений.
     ------
     ### **2. Этап Confirm (подтверждение транзакции)**
     - **Состояние блокировки**: **Освобождение "логической блокировки"** (подтверждение замороженных ресурсов, завершение окончательных действий).
     - **Действия**:
       - Счет Петра: Очистка метки заморозки (`frozen -= 500`).
       - Счет Ивана: Реальное увеличение баланса (`balance += 500`, `frozen += 500` для восстановления значения заморозки до 0).
     - **Цель**: 
       Подтверждение транзакции, освобождение замороженных ресурсов (логическая блокировка), чтобы ресурсы стали доступны для других транзакций.
     ------
     ### **3. Этап Cancel (откат транзакции)**
     - **Состояние блокировки**: **Освобождение "логической блокировки"** (откат замороженных ресурсов).
     - **Действия**:
       - Счет Петра: Возврат замороженной суммы обратно на баланс (`balance += 500`, `frozen -= 500`).      - Счёт Ивана: Очистка резервированного приема суммы (`frozen += 500` для восстановления значения заморозки до 0).
     - **Цель**: 
       Откат транзакции, освобождение замороженных ресурсов (логическая блокировка), восстановление исходного состояния.
     ------
     ### **Сводка механизма блокировки**
     | Этап        | Состояние блокировки         | Ключевые действия                                       |
     | :---------- | :--------------------------- | :----------------------------------------------------- |
     | **Try**     | **Удержание логической блокировки** | Заморозка ресурсов (например, денег), предотвращение использования другими транзакциями.  |
     | **Confirm** | **Освобождение логической блокировки** | Подтверждение действий, очистка меток заморозки, ресурсы становятся доступны для других транзакций.  |
     | **Cancel**  | **Освобождение логической блокировки** | Откат действий, восстановление ресурсов до исходного состояния, освобождение заморозки.  |
     ------
     ### **Различие с традиционными блокировками базы данных**
     ------  - **"Lock" в TCC — это логический замок уровня бизнес-логики**: 
      Ресурсы маркируются состоянием через поля (например, `frozen`), не зависят от блокировок строк или таблиц базы данных.
    - **Краткосрочное владение замками**: 
      Логический замок удерживается только на этапе Try, на этапах Confirm и Cancel он немедленно освобождается, что сокращает время использования ресурсов.
    - **Отсутствие риска застревания**: 
      Логическая блокировка позволяет избежать проблем, связанных с блокировкой ресурсов на длительное время, что снижает риск застревания транзакций.     Уровень бизнес-логики управляет ресурсами через поля состояния, не требуя ожидания истечения времени блокировки базы данных.
     ------
     ### **Пример сценария (перевод денег банком)**  
     1.   **Этап Try**:  
        - Замораживание 500 юаней на счете Чжан Саня, резервирование 500 юаней для приема на счете Ли Сяо.
       - **Другие транзакции не могут изменять замороженную сумму на счете Чжан Саня** (через проверку бизнес-логики `balance >= 0`).
        plaintext
        Копировать
        ```
       Название счета | Реальный баланс | Замороженная сумма
       Чжан Сян       | 500              | 500    (логический замок активен)
       Ли Сяо        | 1000             | -500   (резерв для приема)
       ```
     2.   **Этап Confirm**:  
        - Подтверждение перевода, удаление метки заморозки, реальное поступление средств на счет Ли Сяо.
        - **Освобождение логического замка**:  
          plaintext
          Копировать
          ```
         Название счета | Реальный баланс | Замороженная сумма
         Чжан Сян       | 500              | 0      (замок освобожден)
         Ли Сяо        | 1500             | 0      (замок освобожден)
         ```
     3.   **Этап Cancel**:  
        - Откат перевода, восстановление баланса Чжан Саня, удаление резерва Ли Сяо.
        - **Освобождение логического замка**:  
          plaintext
          Копировать
          ```
         Название счета | Реальный баланс | Замороженная сумма
         Чжан Сян       | 1000             | 0      (замок освобожден)
         Ли Сяо        | 1000             | 0      (замок освобожден)
         ```
     ------
     ### **Преимущества TCC**    - **Отсутствие длительной блокировки ресурсов**: Логический замок удерживается только на этапе Try, на этапах Confirm и Cancel он быстро освобождается.
    - **Высокая параллельность**: Изоляция достигается через бизнес-логику, а не блокировки базы данных, что позволяет избежать конкуренции за блокировки.
    - **Гибкость**: Возможность настройки правил резервирования ресурсов (например, заморозка, резервирование запасов), что позволяет адаптироваться к сложным бизнес-сценариям.
     Через механизм "логического замка" TCC обеспечивает изоляцию транзакций, при этом избегая производственных ограничений традиционных блокировок, что делает его идеальным решением для высоконагруженных распределенных систем.
   ## Четвертая часть: TCC — двухэтапное компенсирующее решение
   **Основные понятия TCC**
   TCC — это аббревиатура от Try-Confirm-Cancel:
   Включает два этапа:
   Этап 1: Резервирование ресурсов (try)
   Этап 2: Подтверждение или отмена резервирования ресурсов (confirm/cancel)
   **Этап Try**:
     Выполнение всех проверок согласованности, резервирование бизнес-ресурсов (приближенная изоляция)## 5. Основные различия между TCC и 3PC### 1. Различия

| **Свойство**        | **TCC**                                             | **3PC**                                           |
| :------------------ | :-------------------------------------------------- | :------------------------------------------------ |
| **Механизм блокировки** | Уровень бизнеса использует замораживание средств для резервирования ресурсов (без блокировки базы данных) | Зависит от блокировки базы данных (например, блокировка строки) |
| **Логика отката**   | Откат через компенсирующие операции в фазе Cancel (контроль через бизнес-код) | Зависит от глобального отката уровня протокола (требуется поддержка базы данных) |
| **Пригодность сценариев** | Высокая конкуренция, сценарии, требующие кастомизации управления ресурсами (например, платежи, запасы) | Сценарии, требующие строгой согласованности транзакций (например, переводы между базами данных) |

---

### 2. Обработка异常场景处理

1. **Провал фазы Try**: Непосредственно вызвать `cancelPhase`, восстановить замороженные средства.
2. **Провал фазы Confirm**: Необходимо повторять логику Confirm до успешного завершения (гарантия конечной согласованности).
3. **Провал фазы Cancel**: Необходимо регистрировать журнал и отправлять уведомление, вмешиваться вручную.

TCC использует механизмы компенсации уровня бизнеса, что обеспечивает высокую производительность и гибкость, подходящую для распределенных сценариев транзакций, требующих детального контроля.

---

### 2. Обработка异常场景处理

1. **Провал фазы Try**: Непосредственно вызвать `cancelPhase`, восстановить замороженные средства.
2. **Провал фазы Confirm**: Необходимо повторять логику Confirm до успешного завершения (гарантия конечной согласованности).
3. **Провал фазы Cancel**: Необходимо регистрировать журнал и отправлять уведомление, вмешиваться вручную.

TCC использует механизмы компенсации уровня бизнеса, что обеспечивает высокую производительность и гибкость, подходящую для распределённых сценариев транзакций, требующих детального контроля.### **3. Сравнение механизмов протокола**
| **Свойство**          | **3PC**                  | **TCC**                    |
| :-------------------- | :----------------------- | :------------------------- |
| **Тип протокола**     | Протокол синхронизации с координатором              | Асинхронный режим с компенсацией                |

---![](D:\git-my-flink-workspace\guage-notes\images\transaction\1645596170(1).jpg)
![](D:\git-my-flink-workspace\guage-notes\images\transaction\1645596539(1).jpg)
![](D:\git-my-flink-workspace\guage-notes\images\transaction\1645597500(1).jpg)

| **Основная идея** | Уменьшение риска блокировки за счет трех этапов | Достижение конечной согласованности с помощью бизнес-компенсации |
|--------------------|------------------------------------------------|--------------------------------------------------------------|
| **Роли участников транзакции** | Пассивные участники (уровень баз данных) | Активные участники (уровень бизнес-логики) |
| **Зависимости** | Зависимость от поддержки протокола XA в базе данных | Зависимость от реализации логики компенсации в бизнес-коде |

------
### **4. Сравнение по этапам**
#### **3PC (три этапа подтверждения)**
1. **CanCommit**: Координатор спрашивает участников, могут ли они подтвердить (проверка ресурсов)
2. **PreCommit**: Координатор отправляет команду предварительного подтверждения (блокировка ресурсов)
3. **DoCommit**: Координатор отправляет команду окончательного подтверждения/отмены
#### **TCC (транзакция с компенсацией)**
1. **Try**: Выделение ресурсов (например, заморозка запасов, создание предварительного заказа)
2. **Confirm**: Подтверждение подтверждения (например, списание реальных запасов, подтверждение заказа)
3. **Cancel**: Отмена операции (например, освобождение замороженных запасов, удаление предварительного заказа)
------
### **5. Ключевые различия**
| **Параметр** | **3PC** | **TCC** |
| :----------- | :------ | :------ | | **Согласованность**     | Сильная согласованность (синхронная блокировка)               | Конечная согласованность (асинхронная неблокирующая)       |
  | **Сложность реализации** | Простой протокол, но зависит от особенностей базы данных         | Высокая инвазивность бизнес-логики, требуется реализация логики компенсации   |
  | **Производительность**   | Высокая задержка (необходимость нескольких сетевых запросов)           | Высокая производительность (этап Try может выполняться параллельно)    |
  | **Устойчивость к отказам** | Низкая (зависит от состояния координатора, сложная обработка таймаутов) | Высокая (обработка отказов через механизмы бизнес-компенсации) |
  | **Применимые сценарии**   | Простые транзакции между базами данных                 | Сложные бизнес-сценарии между сервисами и ресурсами   |
  | **Типичные проблемы**   | Одиночная точка отказа координатора, проблема разделения сети | Пустая отмена, идемпотентность, проблема зависших операций       |
   ------
   ### **6. Пример сравнения сценариев**
   #### **Перевод средств (3PC)**
   - **CanCommit**: Проверка двух счетов на возможность операции (достаточное количество средств)
   - **PreCommit**: Блокировка обоих счетов (запрет других операций)
   - **DoCommit**: Реальное выполнение перевода средств и освобождение блокировки
   #### **Создание заказа и уменьшение запасов (TCC)**
   - **Try**: Создание предварительного заказа (состояние `TRY`), заморозка запасов (`поле frozen`)  - **Confirm**: Изменение состояния заказа на `CONFIRMED`, списание реальных запасов
   - **Cancel**: Удаление предварительного заказа, освобождение замороженных запасов
  ------
   ### **7. Сравнение преимуществ и недостатков**
   #### **Преимущества 3PC**
   - Уменьшение времени блокировки в  Yöntem 2PC (за счет этапа PreCommit) - Уменьшение влияния однопунктной отказу координатора
   #### **Недостатки 3PC**
   - Сложность реализации, мало используется в реальной жизни
   - Не решает полностью проблему несогласованности данных (сетевые разделения все еще могут привести к несогласованности)
   #### **Преимущества TCC**
   - Отсутствие глобальных блокировок, более высокая производительность
   - Высокая гибкость бизнеса (можно настраивать логику компенсации)
   - Нативная поддержка конечной согласованности
   #### **Недостатки TCC**
   - Высокая инвазивность бизнеса (необходимо реализовать Try/Confirm/Cancel)
   - Необходимо управлять идемпотентностью, зависящими операциями и другими граничными вопросами
  ------
   ### **8. Обзор подходящих сценариев**
   | **Схема** | **Подходящие сценарии** |
   | :-------- | :---------------------- |
   | **3PC**   | Простые транзакции между базами данных (например, банковские переводы), требующие строгой согласованности и готовые принять низкую производительность |

Примечание: В тексте есть несколько слов и фраз на китайском и английском языках, которые были переведены на русский. Однако, некоторые фразы остаются без перевода из-за неясности контекста или отсутствия явного перевода в исходном тексте. | **TCC**   | Сложные бизнес-процессы между сервисами (например, оформление заказа в электронной коммерции), требующие высокой производительности и надежности, готовые принять конечную согласованность |
   ------
   ### **9. Как выбрать?**
   - Если бизнес прост и зависит от базы данных: **предпочтительно 3PC**
   - Если бизнес сложен или включает вызовы между сервисами: **обязательно выбирать TCC**
   - Если требуется высокая производительность и гибкость: **TCC является лучшим решением** (хотя и требует большего времени на реализацию)
   В реальном производстве **TCC используется чаще всего** (например, в электронной коммерции, финансовых системах), а  Yöntem 3PC из-за сложности реализации и низкой производительности обычно заменяется распределенными транзакционными фреймворками (например, Seata) или конечной согласованностью на основе сообщений.
   ## Шесть. Распределенные транзакционные фреймворки Seata и подробное описание SAGA-модели
   SAGA-модель в **Seata** представляет собой решение распределенных транзакций для длинных транзакций, использующее **компенсационные механизмы** для достижения конечной согласованности. Она особенно полезна для сценариев, где требуется работа через несколько сервисов, сложные процессы и гибкие компенсации. Ниже представлены основные принципы и детали реализации:
   ### Основные принципы SAGA-модели
   1. **Разбиение транзакций и компенсационные механизмы**

---

Исправленный текст:

| **TCC**   | Сложные бизнес-процессы между сервисами (например, оформление заказа в электронной коммерции), требующие высокой производительности и надежности, готовые принять конечную согласованность |
   ------
   ### **9. Как выбрать?**
   - Если бизнес прост и зависит от базы данных: **предпочтительно 3PC**
   - Если бизнес сложен или включает вызовы между сервисами: **обязательно выбирать TCC**
   - Если требуется высокая производительность и гибкость: **TCC является лучшим решением** (хотя и требует большего времени на реализацию)
   В реальном производстве **TCC используется чаще всего** (например, в электронной коммерции, финансовых системах), а 3PC из-за сложности реализации и низкой производительности обычно заменяется распределенными транзакционными фреймворками (например, Seata) или конечной согласованностью на основе сообщений.
   ## Шесть. Распределенные транзакционные фреймворки Seata и подробное описание SAGA-модели
   SAGA-модель в **Seata** представляет собой решение распределенных транзакций для длинных транзакций, использующее **компенсационные механизмы** для достижения конечной согласованности. Она особенно полезна для сценариев, где требуется работа через несколько сервисов, сложные процессы и гибкие компенсации. Ниже представлены основные принципы и детали реализации:
   ### Основные принципы SAGA-модели
   1. **Разбиение транзакций и компенсационные механизмы**    SAGA разбивает распределённые транзакции на несколько **локальных транзакций** (называемых подтранзакциями), каждая из которых соответствует **положительной операции** (Действие) и **компенсационной операции** (Компенсация). Положительная операция выполняет реальную бизнес-логику, компенсационная операция используется для отмены влияния положительной операции. Если любая подтранзакция завершается неудачей, система запускает **компенсационные операции** в обратном порядке для отката выполненных шагов и восстановления согласованности данных.
   2.   **Два режима выполнения**
     - **Последовательное выполнение**: последовательное выполнение положительных операций в определённом порядке, при неудаче — компенсация в обратном порядке.
     - **Параллельное выполнение**: поддерживает асинхронное выполнение нескольких положительных операций, компенсация запускается в зависимости от зависимостей.
   3.   **Конечная согласованность**
  Не зависит от глобального блокировочного механизма, обеспечивая конечную согласованность через компенсирующие механизмы, но **не гарантирует строгой изоляции** (может привести к грязному чтению или потере обновлений).---

### II. Основные компоненты и процессы SAGA-модели

#### 1. **Машина состояний**
Модель SAGA в Seata использует **машину состояний** для организации транзакций. Разработчики должны определить процесс транзакций с помощью JSON-файла, который включает следующие ключевые элементы:
- **Узел (Состояние)**: представляет вызов сервиса (например, `ServiceTask`) и может быть настроен для компенсационного действия.
- **Контроль процесса**: поддерживает условные ветвления (`Choice`), параллельное выполнение, подпроцессы (`SubStateMachine`) и другие сложные логики.
- **Пример JSON-определения**:
```json
{
  "Name": "order_saga",
  "States": [
    {
      "Name": "CreateOrder",
      "Type": "ServiceTask",
      "ServiceName": "order-service",
      "Action": "createOrder",
      "Compensate": "cancelOrder"
    }
  ]
}

2. Процесс работы

  1. Запуск транзакции: транзакционный координатор (TC) регистрирует глобальную транзакцию и генерирует уникальный идентификатор транзакции (XID).
  2. Выполнение основной операции: последовательно вызывает сервисы согласно определению машины состояний (например, создание заказа, уменьшение запасов).
  3. Обработка ошибок: если какой-то шаг завершается неудачей, запускается компенсационное действие (например, отмена заказа, восстановление запасов).
  4. Завершение транзакции: состояние глобальной транзакции помечается как успешное или откат.---

III. Преимущества и недостатки SAGA-модели

Преимущества:

  • Отсутствие глобальных блокировок: локальные транзакции освобождают ресурсы после завершения, что делает модель подходящей для длинных транзакций и повышает производительность.
  • Высокая гибкость: поддерживает гетерогенные системы (например, устаревшие системы или внешние службы), без необходимости модификации участников.
  • Асинхронное выполнение: событийно-ориентированная архитектура увеличивает пропускную способность, что делает модель подходящей для высоконагруженных сценариев.

Недостатки:

  • Высокая сложность разработки: требуется ручное написание основной и компенсационной логики, а также обеспечение идемпотентности.
  • Проблемы изоляции: возможны грязное чтение или потеря обновлений, требуются дополнительные меры на уровне бизнес-логики (например, семантические блокировки).
  • Стоимость компенсации: каждому подтранзакции требуется разработка компенсационной логики, что увеличивает затраты на поддержку.

---### IV. Пригодные сценарии

  1. Длинные транзакции: такие как оформление заказа в электронной коммерции (создание заказа → уменьшение запасов → оплата), где процесс занимает длительное время.
  2. Интеграция гетерогенных систем: участники представляют собой устаревшие системы или внешние службы, которые не могут быть изменены.
  3. Сценарии конечной согласованности: бизнес может выдерживать кратковременные несоответствия данных (например, обновление статуса доставки).--- В разделе "Настройка сети" указано, что значение должно быть "192.168.1.1". Однако, при выполнении команды ping 192.168.1.1, программа выдает сообщение "Destination host unreachable".

Для настройки параметров безопасности необходимо указать значение "enabled". В случае, если параметр остается "disabled", система будет находиться в небезопасном режиме.

В разделе "Настройка базы данных" необходимо указать имя пользователя "admin" и пароль "password123". При попытке входа с неверными данными, система выдает сообщение "Access denied".

Для настройки параметров сервера необходимо указать значение "production". Если параметр остается "development", система будет работать в режиме разработки.

В разделе "Настройка сети" указано, что значение должно быть "192.168.1.1". Однако, при выполнении команды ping 192.168.1.1, программа выдает сообщение "Целевой хост недоступен".

Для настройки параметров безопасности необходимо указать значение "включен". В случае, если параметр остается "выключен", система будет находиться в небезопасном режиме.

В разделе "Настройка базы данных" необходимо указать имя пользователя "admin" и пароль "password123". При попытке входа с неверными данными, система выдает сообщение "Доступ запрещен".

Для настройки параметров сервера необходимо указать значение "production". Если параметр остается "development", система будет работать в режиме разработки.### V. Лучшие практики

  1. Разработка идемпотентности — Компенсирующие операции должны поддерживать повторное выполнение (например, с помощью уникального идентификатора транзакции для де дублирования) 89.
  2. Защита от зависаний
    • Обработка случаев, когда компенсирующая операция выполняется до основной операции (например, запись транзакционного журнала, чтобы избежать пустой компенсации) 89.
  3. Оптимизация машины состояний
    • Использование визуального конструктора (например, Seata Saga Designer) для упрощения JSON-конфигурации 79.
  4. Компенсация изолированности
    • Применение пессимистичного подхода (например, сначала уменьшение ресурсов, а затем выполнение операции) или бизнес-блокировки для снижения конфликтов параллелизма 810.

    VI. Сравнение с другими моделями

    Модель Согласованность Изолированность Применимые сценарии Вторжение
    AT Конечная согласованность Слабая Простые транзакции между базами данных Низкая (основана на анализе SQL)
    TCC Конечная согласованность Сильная Высокопараллельные короткие транзакции Высокая (необходимо реализовать Try/Confirm/Cancel)
    SAGA Конечная согласованность Отсутствует Длинные процессы, архитектура с различными системами Средняя (необходимо определить машину состояний)

    7. Заключение

    Модель SAGA в Seata использует машину состояний и механизмы компенсации для предоставления гибкого решения по управлению транзакциями для сложных бизнес-сценариев. Несмотря на высокие затраты на разработку и отсутствие изолированности, её асинхронное выполнение, отсутствие блокировок и другие характеристики делают её выдающейся в длинных процессах и интеграции различных систем. В реальных приложениях следует учитывать требования бизнеса, правильно проектировать логику компенсации и усиливать инвариантность, чтобы обеспечить конечную согласованность.

    7. Глубокое понимание процессов Seata

    1) Обзор

    Seata — это распределённая система управления транзакциями, открытая Alibaba, которая основана на модели AT (двухфазного подтверждения). Она использует аннотации для реализации независимости от бизнес-логики. Перед изучением исходного кода Seata важно понять его принципы. В конце концов, код является конкретизацией принципов, а принципы — абстракцией кода!

    2) TCC — двухфазная модель компенсации

    В двухфазной модели есть три роли: 1.TC (Transaction Coordinator), координатор транзакций, который в исходном коде Seata Server выполняет роль координатора транзакций, поддерживает глобальное состояние блокировок и управляет глобальными транзакциями.
  5. TM (Transaction Manager), управление транзакциями, сервисы, использующие глобальные транзакции через аннотации, являются управителями транзакций, контролируют область действия глобальных транзакций и выполняют их подтверждение или откат.
  6. RM (Resource Manager), ресурсный менеджер, часть бизнес-кода, которая вызывается удаленно, отвечает за выполнение локальной транзакции и за подтверждение и откат локальной транзакции.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/yangdechao_admin-guage-notes.git
git@api.gitlife.ru:oschina-mirror/yangdechao_admin-guage-notes.git
oschina-mirror
yangdechao_admin-guage-notes
yangdechao_admin-guage-notes
master