Обновление

This commit is contained in:
Struchkov Mark 2025-01-17 15:29:17 +03:00
parent 7678dd0440
commit 6d52584f95
No known key found for this signature in database
GPG Key ID: A3F0AC3F0FA52F3C
27 changed files with 323 additions and 28 deletions

View File

@ -8,11 +8,11 @@ date:
![[../../meta/files/images/Pasted image 20241103022605.png]] ![[../../meta/files/images/Pasted image 20241103022605.png]]
CAP теорема — это принцип, описывающий фундаментальные ограничения, с которыми сталкиваются распределённые вычислительные системы в контексте обеспечения следующих трёх свойств: CAP теорема — это принцип, описывающий фундаментальные ограничения, с которыми сталкиваются распределённые вычислительные системы в контексте обеспечения следующих трёх свойств:
- **Согласованность (Consistency)**: Каждый раз, когда данные читаются, возвращается самое последнее записанное значение или ошибка. С другими словами, операции с данными выглядят так, будто выполняются в некоторой строгой последовательности, одна за другой - **Согласованность** ([[Согласованность данных|Consistency]]): Каждый раз, когда данные читаются, возвращается самое последнее записанное значение или ошибка. С другими словами, операции с данными выглядят так, будто выполняются в некоторой строгой последовательности, одна за другой
- Доступность ([[../../../../_inbox/Availability|Availability]]): Каждый запрос на получение или запись данных получает ответ, независимо от состояния системы, даже если некоторые части системы вышли из строя. - **Доступность** ([[../../../../_inbox/Availability|Availability]]): Каждый запрос на получение или запись данных получает ответ, независимо от состояния системы, даже если некоторые части системы вышли из строя.
- **Устойчивость к разделению (Partition Tolerance)**: Система продолжает функционировать, даже если произошло "разделение" — потеря связи между узлами в распределённой сети. То есть система способна переносить произвольное число сообщений, которые задерживаются или теряются в сети. - **Устойчивость к разделению (Partition Tolerance)**: Система продолжает функционировать, даже если произошло "разделение" — потеря связи между узлами в распределённой сети. То есть система способна переносить произвольное число сообщений, которые задерживаются или теряются в сети.
==Согласно теореме CAP, в любой момент времени система может обеспечивать только два из этих трёх свойств.== Это означает, что при разработке системы приходится принимать компромисс между этими свойствами в зависимости от требований приложения и условий эксплуатации. Например, если для системы критически важна согласованность данных и её устойчивость к разделению, возможно придётся пожертвовать её доступностью в некоторых сценариях. ==Согласно теореме CAP, в любой момент времени система может обеспечивать только два из этих трёх свойств.== Это означает, что при разработке системы приходится принимать компромисс между этими свойствами в зависимости от требований приложения и условий эксплуатации. Например, если для системы критически важна [[согласованность данных]] и её устойчивость к разделению, возможно придётся пожертвовать её доступностью в некоторых сценариях.
## Свободные заметки ## Свободные заметки
- Google заявляет, что их продукт Google Spanner якобы нарушает CAP теорему. - Google заявляет, что их продукт Google Spanner якобы нарушает CAP теорему.
*** ***

View File

@ -0,0 +1,56 @@
---
aliases:
- CDC
tags:
- maturity/🌱
date: 2025-01-13
---
**Change Data Capture (CDC)** — это технология для отслеживания изменений в данных [[../../meta/zero/00 Реляционная база данных|базы данных]] (вставка, обновление, удаление) и публикации этих изменений в виде событий для других систем. CDC играет ключевую роль в построении [[Событийно-ориентированная архитектура|событийных архитектур]] и интеграции данных между системами.
**Применение CDC**
- **Миграция данных**. Перенос данных между системами с минимальными простоями.
- **Событийные системы**. Построение архитектур, где изменения в данных становятся триггерами для выполнения действий.
- **Аналитика в реальном времени**. Передача данных в системы аналитики (например, ClickHouse, Elasticsearch).
- **Интеграция приложений**. Связывание разнородных систем через обмен данными.
**Преимущества CDC**
- **Синхронизация данных в реальном времени**. Автоматическое обновление данных между системами.
- **Снижение нагрузки на базу данных**. Обрабатываются только изменения, а не полные данные.
- **Поддержка событийной архитектуры**. Преобразует изменения в события, которые могут обрабатываться асинхронно.
- **Простота интеграции**. Позволяет связывать разные приложения и системы через единый механизм передачи данных.
**Основные подходы к реализации CDC**
- **Журнал транзакций (Transaction Logs)**. Изменения отслеживаются с помощью анализа журнала транзакций базы данных (логов WAL, redo, binlog).
- **Плюсы**: Высокая производительность, минимальная нагрузка на базу данных.
- **Минусы**: Требует доступа к журналу транзакций, ограниченная поддержка некоторых баз.
- **Триггеры в базе данных**. Изменения фиксируются с помощью триггеров, которые вызываются при выполнении операций (вставка, обновление, удаление).
- **Плюсы**: Простота настройки.
- **Минусы**: Снижение производительности базы данных, сложность поддержки.
- **Опрос данных (Polling)**. Система периодически проверяет таблицы базы данных на наличие изменений.
- **Плюсы**: Простая реализация.
- **Минусы**: Высокая нагрузка на базу данных, задержки между изменениями и их обработкой.
**Инструменты для CDC**
- **Debezium**
- Open-source решение для CDC.
- Поддерживает PostgreSQL, MySQL, MongoDB, Oracle и другие.
- Интегрируется с Kafka для публикации событий.
- **Oracle GoldenGate**
- Коммерческий продукт для CDC.
- Высокая производительность, поддержка множества СУБД.
- **Striim**
- Платформа для потоковой обработки данных с поддержкой CDC.
- Включает инструменты визуализации и настройки ETL.
***
## Мета информация
**Область**:: [[Архитектурный паттерн]]
**Родитель**:: [[Интеграция информационных систем|Интеграция информационных систем]]
**Источник**::
**Создана**:: [[2025-01-13]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -24,7 +24,7 @@ date: 2024-11-24
Лучшие практики Лучшие практики
- **Чёткие границы владения данными**. Определите чёткие границы владения данными для каждого сервиса, - [[Bounded Context|Ограниченный контекст]]. Это помогает избежать пересечений и зависимостей между сервисами, а также упрощает управление данными. - **Чёткие границы владения данными**. Определите чёткие границы владения данными для каждого сервиса, - [[Bounded Context|Ограниченный контекст]]. Это помогает избежать пересечений и зависимостей между сервисами, а также упрощает управление данными.
- [[Событийно-ориентированная архитектура|Событийно-ориентированная архитектура]]. Для обеспечения согласованности данных между микросервисами можно использовать события. Например, при изменении данных в одном сервисе он отправляет событие, на которое подписаны другие сервисы, которым эти данные могут быть нужны. - [[Событийно-ориентированная архитектура|Событийно-ориентированная архитектура]]. Для обеспечения согласованности данных между микросервисами можно использовать события. Например, при изменении данных в одном сервисе он отправляет событие, на которое подписаны другие сервисы, которым эти данные могут быть нужны.
- **Реализация паттернов для согласованности**. Используйте паттерны, такие как [Saga](Реализация%20повествования%20(Saga).md), чтобы координировать действия между несколькими микросервисами и гарантировать согласованность данных без использования глобальных транзакций. - **Реализация паттернов для согласованности**. Используйте паттерны, такие как [Saga](Реализация%20повествования%20(Saga).md), чтобы координировать действия между несколькими микросервисами и гарантировать [[согласованность данных]] без использования глобальных транзакций.
- **API вместо прямого доступа к данным**. Доступ к данным одного микросервиса другими должен осуществляться только через публичные API. Это помогает соблюдать [[Инкапсуляция|инкапсуляцию]] и обеспечивает безопасное взаимодействие между сервисами. - **API вместо прямого доступа к данным**. Доступ к данным одного микросервиса другими должен осуществляться только через публичные API. Это помогает соблюдать [[Инкапсуляция|инкапсуляцию]] и обеспечивает безопасное взаимодействие между сервисами.
*** ***
## Мета информация ## Мета информация

View File

@ -27,7 +27,7 @@ Event Sourcing — это [[архитектурный паттерн]], при
1. **Финансовые системы**. Для учета транзакций и обеспечения полного логирования операций. 1. **Финансовые системы**. Для учета транзакций и обеспечения полного логирования операций.
2. **E-commerce**. Хранение всех изменений корзины пользователя или заказов. 2. **E-commerce**. Хранение всех изменений корзины пользователя или заказов.
3. **IoT**. Сохранение событий от датчиков для анализа в реальном времени или ретроспективы. 3. **IoT**. Сохранение событий от датчиков для анализа в реальном времени или ретроспективы.
4. Паттерн [[../../../../knowledge/dev/архитектура/паттерн/CQRS|CQRS]]. Часто используется совместно с Event Sourcing для разделения операций чтения и записи. 4. Паттерн [[../../../../knowledge/dev/архитектура/паттерн/Command Query Responsibility Segregation|Command Query Responsibility Segregation]]. Часто используется совместно с Event Sourcing для разделения операций чтения и записи.
*** ***
## Мета информация ## Мета информация
**Область**:: [[../../meta/zero/00 Архитектура ИС|00 Архитектура ИС]] **Область**:: [[../../meta/zero/00 Архитектура ИС|00 Архитектура ИС]]

View File

@ -2,6 +2,8 @@
aliases: aliases:
- transactional outbox - transactional outbox
- транзакционный аутбокс - транзакционный аутбокс
- Outbox-паттерн
- Outbox Pattern
tags: tags:
- maturity/🌱 - maturity/🌱
date: 2024-11-15 date: 2024-11-15
@ -16,7 +18,7 @@ Transactional Outbox — это [[Паттерн проектирования|ш
**Преимущества:** **Преимущества:**
- **Гарантированная доставка сообщений**: сообщения фиксируются вместе с бизнес-операциями, что предотвращает ситуацию, когда данные в базе данных обновлены, а сообщение не отправлено. - **Гарантированная доставка сообщений**: сообщения фиксируются вместе с бизнес-операциями, что предотвращает ситуацию, когда данные в базе данных обновлены, а сообщение не отправлено.
- **Упрощение архитектуры**: использование таблицы `outbox` вместо распределённых транзакций (2PC) значительно упрощает архитектуру и позволяет избежать сложных механизмов блокировки. - **Упрощение архитектуры**: использование таблицы `outbox` вместо распределённых транзакций ([[../fundamental/Two-Phase Commit|2PC]]) значительно упрощает архитектуру и позволяет избежать сложных механизмов блокировки.
**Недостатки:** **Недостатки:**
- **Дополнительная задержка**: отправка сообщений через фоновый процесс может вызвать небольшую задержку в доставке сообщений, по сравнению с немедленной отправкой. - **Дополнительная задержка**: отправка сообщений через фоновый процесс может вызвать небольшую задержку в доставке сообщений, по сравнению с немедленной отправкой.

View File

@ -17,7 +17,7 @@ date:
**Проблемы:** **Проблемы:**
1. **Сложность управления**: Управление множеством узлов и их координация может быть значительно сложнее, чем управление одним мощным сервером. Нужно делать балансировку вызовов. 1. **Сложность управления**: Управление множеством узлов и их координация может быть значительно сложнее, чем управление одним мощным сервером. Нужно делать балансировку вызовов.
2. **Сложность разработки**: Разработка приложений, способных эффективно использовать ресурсы в распределенной среде, может быть более сложной, а значит программисты обходятся дороже. 2. **Сложность разработки**: Разработка приложений, способных эффективно использовать ресурсы в распределенной среде, может быть более сложной, а значит программисты обходятся дороже.
3. **Согласованность данных**: Обеспечение согласованности данных между множеством узлов может представлять собой вызов, особенно в системах, где требуется высокий уровень согласованности. 3. [[../Согласованность данных|Согласованность данных]]: Обеспечение согласованности данных между множеством узлов может представлять собой вызов, особенно в системах, где требуется высокий уровень согласованности.
4. **Затраты на сеть**: Горизонтальное масштабирование может повлечь за собой увеличенные затраты на сетевое оборудование и управление сетью, особенно если узлы географически распределены. 4. **Затраты на сеть**: Горизонтальное масштабирование может повлечь за собой увеличенные затраты на сетевое оборудование и управление сетью, особенно если узлы географически распределены.
Частные проблемы: Частные проблемы:

View File

@ -14,7 +14,7 @@ linked:
- Все транзакции чтения и записи фиксируются только после того, как они были одобрены группой. - Все транзакции чтения и записи фиксируются только после того, как они были одобрены группой.
- Read-only транзакции не требуют координации внутри группы и фиксируются немедленно - Read-only транзакции не требуют координации внутри группы и фиксируются немедленно
- Групповая репликация - eventual consistency система - Групповая репликация - [[../Еventual consistency|Еventual consistency]] система
![](../../../meta/files/images/Pasted%20image%2020240605091036.png) ![](../../../meta/files/images/Pasted%20image%2020240605091036.png)

View File

@ -1,5 +1,7 @@
--- ---
aliases: aliases:
- Monotonic Read Consistency
- Monotonic Read
tags: tags:
- maturity/🌱 - maturity/🌱
date: date:

View File

@ -14,6 +14,10 @@ date: 2024-12-02
- [[Событийно-ориентированная архитектура]] - [[Событийно-ориентированная архитектура]]
- [[Event Sourcing]] - [[Event Sourcing]]
- [[../../../../knowledge/dev/архитектура/паттерн/Command Query Responsibility Segregation|CQRS]]
Миграция/синхронизация данных:
- [[Change Data Capture|Change Data Capture]]
*** ***
## Мета информация ## Мета информация
**Область**:: [[../../meta/zero/00 Архитектура ИС|00 Архитектура ИС]] **Область**:: [[../../meta/zero/00 Архитектура ИС|00 Архитектура ИС]]
@ -30,6 +34,8 @@ date: 2024-12-02
- [[Event Sourcing]] - [[Event Sourcing]]
- [[Serverless]] - [[Serverless]]
- [[Монолитная архитектура]] - [[Монолитная архитектура]]
- [[Событийно-ориентированная архитектура]]
- [[00 Микросервисная архитектура]] - [[00 Микросервисная архитектура]]
- [[Command Query Responsibility Segregation]]
<!-- SerializedQuery END --> <!-- SerializedQuery END -->

View File

@ -0,0 +1,22 @@
---
aliases:
- Конечная согласованность
- eventual consistency
tags:
- maturity/🌱
date: 2025-01-15
---
***
## Мета информация
**Область**:: [[../../meta/zero/00 Архитектура ИС|00 Архитектура ИС]]
**Родитель**:: [[Согласованность данных|Согласованность данных]]
**Источник**::
**Создана**:: [[2025-01-15]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -5,6 +5,8 @@ aliases:
- идемпотентности - идемпотентности
- идемпотентную - идемпотентную
- идемпотентные - идемпотентные
- Идемпотентные операции
- Idempotence
tags: tags:
- maturity/🌱 - maturity/🌱
date: 2024-09-11 date: 2024-09-11

View File

@ -26,7 +26,7 @@ date: 2024-11-24
2. **Увеличение объёма хранилища**. Хранение данных в нескольких формах требует больше места в хранилище. Для высоконагруженных систем с большими объёмами данных это может стать значительным фактором. 2. **Увеличение объёма хранилища**. Хранение данных в нескольких формах требует больше места в хранилище. Для высоконагруженных систем с большими объёмами данных это может стать значительным фактором.
Лучшие практики для работы с избыточностью данных Лучшие практики для работы с избыточностью данных
1. **Продуманная архитектура синхронизации**. Используйте [[Событийно-ориентированная архитектура|событийную архитектуру]], чтобы поддерживать согласованность данных. Например, при добавлении нового сообщения можно отправить событие, которое обновит индекс последних сообщений. 1. **Продуманная архитектура синхронизации**. Используйте [[Событийно-ориентированная архитектура|событийную архитектуру]], чтобы поддерживать [[согласованность данных]]. Например, при добавлении нового сообщения можно отправить событие, которое обновит индекс последних сообщений.
2. **Оценка необходимости избыточности**. Вводите избыточность только там, где это действительно необходимо для повышения производительности или удобства работы. Не стоит избыточно усложнять систему там, где этого можно избежать. 2. **Оценка необходимости избыточности**. Вводите избыточность только там, где это действительно необходимо для повышения производительности или удобства работы. Не стоит избыточно усложнять систему там, где этого можно избежать.
3. **Мониторинг консистентности**. Внедряйте механизмы проверки и восстановления консистентности данных между копиями. Это поможет вовремя обнаружить и устранить расхождения. 3. **Мониторинг консистентности**. Внедряйте механизмы проверки и восстановления консистентности данных между копиями. Это поможет вовремя обнаружить и устранить расхождения.

View File

@ -0,0 +1,24 @@
---
aliases:
tags:
- maturity/🌱
date: 2025-01-13
---
Подходы:
- [[Change Data Capture]]
***
## Мета информация
**Область**:: [[../../meta/zero/00 Архитектура ИС|00 Архитектура ИС]]
**Родитель**::
**Источник**::
**Создана**:: [[2025-01-13]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
<!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
- [[Change Data Capture]]
<!-- SerializedQuery END -->

View File

@ -2,18 +2,20 @@
aliases: aliases:
tags: tags:
- maturity/🌱 - maturity/🌱
- content/problem
date: 2024-11-15 date: 2024-11-15
--- ---
Отправка сообщений в [[00 Kafka|Kafka]] из [[Транзакция БД|транзакций базы данных]] приводит к проблемам с согласованностью данных между системами, особенно в условиях распределённых систем. Если сначала происходит отправка сообщения в Kafka, а затем транзакция в БД откатывается, то сообщение останется в Kafka, но база данных не зафиксирует изменений, что приведёт к рассинхронизации данных. Взаимодействие между [[../../../../_inbox/Транзакция БД|транзакциями базы данных]] и отправкой сообщений в [[../../../../_inbox/00 Kafka|Kafka]] может приводить к несогласованности данных. Пример проблемы: если сообщение отправлено в Kafka, но транзакция базы данных откатывается, сообщение останется в Kafka, тогда как база данных не зафиксирует изменений. Это вызывает рассинхронизацию между системами.
Для обеспечения согласованности данных между базой данных и Kafka необходимо использовать следующие подходы: Для решения проблемы используются следующие подходы:
- [[Transactional Outbox|Transactional Outbox]]. Этот подход позволяет отделить запись в базу данных от отправки сообщения в брокер. Изменения сначала фиксируются в основной таблице базы данных, а затем записываются в специальную таблицу "Outbox". Отдельный процесс или сервис асинхронно считывает из таблицы "Outbox" и отправляет сообщения в Kafka, что гарантирует согласованность данных. - [[Transactional Outbox|Transactional Outbox]]. Изменения фиксируются в основной таблице базы данных и одновременно записываются в отдельную таблицу “Outbox”. Асинхронный процесс или сервис считывает записи из “Outbox” и отправляет их в Kafka. Это позволяет отделить транзакцию базы данных от отправки сообщений и гарантировать [[Согласованность данных|согласованность]].
- Change Data Capture (CDC). Использование CDC с инструментами вроде Debezium позволяет отслеживать изменения в базе данных и публиковать их в Kafka. Это решение подходит для случаев, когда необходимо обеспечить автоматическую синхронизацию изменений, но может потребовать дополнительных настроек и ресурсов. - [[Change Data Capture]] (CDC). С помощью инструментов, таких как Debezium, отслеживаются изменения в базе данных. Эти изменения публикуются в Kafka в режиме реального времени. CDC подходит для автоматической синхронизации данных, но требует настройки и дополнительных ресурсов.
- Распределённые транзакции (двухфазный коммит). Этот метод позволяет гарантировать согласованность между базой данных и Kafka за счёт координации транзакций между ними. Однако этот подход часто считается сложным и менее масштабируемым, особенно в распределённых системах. - Распределённые транзакции (двухфазный коммит). Этот подход координирует транзакции между базой данных и Kafka, гарантируя [[Согласованность данных|согласованность]]. Однако он считается сложным в реализации и менее масштабируемым, особенно в распределённых системах.
Другая серьёзная проблема связана с возможностью двойной обработки. В случае сбоя приложения или инфраструктуры транзакции могут повторяться, приводя к дублированию событий в Kafka. Дублирование событий может вызвать некорректное состояние системы, повторное выполнение операций. Чтобы предотвратить дублирование, можно использовать следующие подходы: При сбоях системы возможна повторная обработка транзакций, что приводит к дублированию событий в Kafka. Это может вызвать повторное выполнение операций и привести к некорректному состоянию системы.
- [[highload/Идемпотентность на базе уникального идентификатора|Идемпотентность на базе уникального идентификатора]]
Для предотвращения дублирования используется [[highload/Идемпотентность на базе уникального идентификатора|идемпотентность на базе уникального идентификатора]]. Пример: каждое сообщение или транзакция сопровождается уникальным идентификатором, который проверяется перед выполнением операции. Если идентификатор уже обработан, операция пропускается.
*** ***
## Мета информация ## Мета информация
**Область**:: [[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]] **Область**:: [[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]

View File

@ -1,5 +1,6 @@
--- ---
aliases: aliases:
- распределённой транзакции
tags: tags:
- maturity/🌱 - maturity/🌱
date: 2024-12-02 date: 2024-12-02

View File

@ -6,6 +6,7 @@ aliases:
- Событийно-ориентированная архитектура - Событийно-ориентированная архитектура
- событийную архитектуру - событийную архитектуру
- Событийная архитектура - Событийная архитектура
- событийных архитектур
tags: tags:
- maturity/🌱 - maturity/🌱
date: date:
@ -44,6 +45,10 @@ date:
- [[Отправка сообщений в Kafka из транзакции БД]] - [[Отправка сообщений в Kafka из транзакции БД]]
- Можно читать бинлог и отправлять в [[Брокер сообщений]] - Можно читать бинлог и отправлять в [[Брокер сообщений]]
- [[Transactional Outbox]]. Сохраняем события в БД, из которой события отправляются в [[Брокер сообщений]]. - [[Transactional Outbox]]. Сохраняем события в БД, из которой события отправляются в [[Брокер сообщений]].
**Тип отправляемых данных:**
- [[Event Sourcing]]. Отправлять только те данные, которые изменились.
- Отправлять целиком актуальные данные.
*** ***
## Мета информация ## Мета информация
**Область**:: [[../../meta/zero/00 Архитектура ИС|00 Архитектура ИС]] **Область**:: [[../../meta/zero/00 Архитектура ИС|00 Архитектура ИС]]

View File

@ -0,0 +1,55 @@
---
aliases:
- Consistency
- согласованность
tags:
- maturity/🌱
date: 2025-01-15
---
**Согласованность данных** — это свойство, гарантирующее, что данные в [[../../../../_inbox/Информационная система|системе]] остаются правильными и соответствуют определённым правилам после выполнения операций. Это важно как для локальных баз данных, так и для распределённых систем.
**Проблемы согласованности**
- **Сетевые задержки**. [[Latency|Задержки]] или сбои в сети увеличивают сложность обеспечения согласованности.
- **Конфликты данных**. При параллельных изменениях системы должны разрешать конфликты.
- **Цена согласованности**. Чем выше уровень согласованности, тем больше задержки и ниже производительность.
**Уровни согласованности**
- **Строгая согласованность (Strong Consistency)**: Все узлы системы видят одно и то же состояние данных в любой момент времени.
- Пример: Системы банковских счетов.
- Недостаток: Высокие [[Latency|задержки]], так как требуется синхронизация между всеми узлами.
- **Чтение после записи (Read-After-Write Consistency)**:
- После записи данных в систему любое последующее чтение возвращает обновлённое значение.
- Пример: Создание или обновление документа.
- [[highload/Монотонное чтение|Монотонное чтение]] (Monotonic Read Consistency):
- Если пользователь прочитал определённое значение данных, последующие чтения не вернут более старое состояние.
- [[Еventual consistency|Конечная согласованность]] (Eventual Consistency): Узлы системы со временем синхронизируются, но в краткосрочной перспективе данные могут быть несогласованными.
- Пример: Системы репликации данных, такие как [[../../../../knowledge/dev/network/DNS|DNS]].
**Методы обеспечения согласованности**
- **Консенсусные алгоритмы**:
- **Paxos, Raft**: Обеспечивают согласованность между узлами в условиях отказов.
- Применяются в распределённых базах данных и системах координаторов.
- **Механизмы транзакций**:
- [[../fundamental/Two-Phase Commit|Двухфазный коммит]] (2PC): Обеспечивает атомарность и согласованность между участниками транзакции.
- **Согласованное журналирование**: Используется для [[highload/Disaster recovery|восстановления]] согласованности после сбоев.
- **Паттерны согласованности**:
- [[Еventual consistency|Eventual Consistency]] + [[Идемпотентность|Idempotence]]: Для систем, допускающих временную рассогласованность.
- [[Transactional Outbox|Outbox Pattern]]: Для передачи данных между системами с гарантией доставки.
***
## Мета информация
**Область**::
**Родитель**::
**Источник**::
**Создана**:: [[2025-01-15]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
<!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
- [[Еventual consistency]]
- [[Согласованность транзакции БД (Сonsistency)]]
<!-- SerializedQuery END -->

View File

@ -25,7 +25,7 @@ linked:
- Выполнить повторно откатившуюся транзакцию - Выполнить повторно откатившуюся транзакцию
**Что реально поможет:** **Что реально поможет:**
- Разделить потоки чтения и записи: [CQRS](CQRS.md) - Разделить потоки чтения и записи: [Command Query Responsibility Segregation](../../../../knowledge/dev/архитектура/паттерн/Command%20Query%20Responsibility%20Segregation.md)
- Использовать материализованные view. - Использовать материализованные view.
- Изменить порядок блокировок ресурсов. Если в разных операциях блокируется определенный набор ресурсов, то блокироваться первым должен всегда один и тот же ресурс - Изменить порядок блокировок ресурсов. Если в разных операциях блокируется определенный набор ресурсов, то блокироваться первым должен всегда один и тот же ресурс
- Пересмотреть [Уровни изоляций транзакций БД](Уровни%20изоляций%20транзакций%20БД.md) - Пересмотреть [Уровни изоляций транзакций БД](Уровни%20изоляций%20транзакций%20БД.md)

View File

@ -14,7 +14,7 @@ linked:
- **S (Shared)** — данные разделены между несколькими ядрами, и их копии синхронизированы с памятью. - **S (Shared)** — данные разделены между несколькими ядрами, и их копии синхронизированы с памятью.
- **I (Invalid)** — данные в кэше недействительны, потому что они были изменены другим ядром или сброшены. - **I (Invalid)** — данные в кэше недействительны, потому что они были изменены другим ядром или сброшены.
==Когда одно ядро изменяет данные в своем кэше, протокол MESI уведомляет другие ядра о том, что их копии этих данных больше не актуальны==. Это позволяет поддерживать согласованность данных между ядрами и предотвращает возможные ошибки. ==Когда одно ядро изменяет данные в своем кэше, протокол MESI уведомляет другие ядра о том, что их копии этих данных больше не актуальны==. Это позволяет поддерживать [[../architecture/Согласованность данных|согласованность данных]] между ядрами и предотвращает возможные ошибки.
*** ***
## Мета информация ## Мета информация

View File

@ -0,0 +1,64 @@
---
aliases:
- 2PC
- двухфазный-коммит
- двухфазный коммит
tags:
- maturity/🌱
date: 2025-01-13
---
**Двухфазный коммит (Two-Phase Commit, 2PC)** — это протокол [[../architecture/Распределенная транзакция|распределённой транзакции]], который обеспечивает [[../architecture/Согласованность данных|согласованность данных]] между несколькими системами или узлами. Он используется для выполнения атомарных операций в распределённых системах, таких как базы данных и брокеры сообщений.
**Преимущества двухфазного коммита**
- **Гарантия согласованности**. Все участники либо фиксируют изменения, либо откатываются к исходному состоянию.
- [[Атомарная операция|Атомарность операций]]. Транзакция выполняется полностью или не выполняется вообще.
**Недостатки двухфазного коммита**
- **Производительность**.
- Протокол увеличивает задержки из-за необходимости согласования между участниками.
- Блокировка ресурсов (например, записей в базе данных) может привести к снижению пропускной способности системы.
- **Риск блокировок (Blocking)**. Если координатор выходит из строя, участники могут остаться в подвешенном состоянии, ожидая дальнейших команд.
- **Сложность реализации**. Настройка двухфазного коммита в распределённых системах требует глубокого понимания протокола и особенностей инфраструктуры.
- **Проблемы масштабирования**. Протокол плохо работает в системах с большим количеством участников из-за увеличения числа сообщений и времени согласования.
Протокол состоит из двух этапов:
- **Фаза подготовки (Prepare Phase)**:
- Координатор транзакции отправляет запрос всем участникам (например, базам данных или брокерам сообщений) с просьбой подготовиться к выполнению операции.
- Участники проверяют возможность выполнения операции и сообщают координатору о своём статусе:
- **“Готов” (Vote Yes)**, если операция может быть выполнена.
- **“Не готов” (Vote No)**, если операция невозможна. Если хотя бы один участник возвращает “Не готов”, координатор инициирует откат транзакции.
- **Фаза фиксации (Commit Phase)**:
- Если все участники подтвердили готовность, координатор отправляет команду зафиксировать изменения (**Commit**).
- Участники фиксируют изменения и подтверждают выполнение операции.
- Если хотя бы один участник не может выполнить фиксацию, координатор отправляет команду отката (**Rollback**) всем участникам.
**Двухфазный коммит применим, если:**
- Критически важно обеспечить [[../architecture/Согласованность данных|согласованность данных]].
- Количество участников в транзакции относительно небольшое.
- Высокая задержка или снижение производительности являются допустимыми.
**Применение двухфазного коммита**.
- **Банковские транзакции**. Обеспечение согласованности при переводе средств между счетами.
- **Обновление нескольких баз данных**. Когда данные в разных базах должны быть изменены синхронно.
- **Интеграция с брокерами сообщений**. Обеспечение атомарности при отправке сообщений и обновлении базы данных.
Однако, в большинстве современных распределённых систем предпочитают альтернативные подходы из-за их большей гибкости и масштабируемости.
**Альтернативы двухфазному коммиту**
- [[../architecture/Идемпотентность|Идемпотентные операции]]. Вместо сложных транзакций системы обрабатывают повторы операций без изменений состояния.
- [[../architecture/Transactional Outbox|Outbox-паттерн]]. Использование промежуточного хранилища для согласования операций.
- [[../architecture/Event Sourcing|Event Sourcing]]. Применение событийной модели, где изменения состояния записываются как события, а не как транзакции.
- [[../../../../_inbox/Basically Available Soft state Eventual consistency|BASE]] вместо [[../database/Свойства транзакций БД|ACID]]. Принятие модели [[../../../../_inbox/Basically Available Soft state Eventual consistency|BASE]], которая допускает временную рассогласованность ради повышения производительности.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Разработка|00 Разработка]]
**Родитель**::
**Источник**::
**Создана**:: [[2025-01-13]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -0,0 +1,50 @@
---
aliases:
- 2-phase lock
- 2PL
tags:
- maturity/🌱
date:
- - 2024-06-20
---
Протокол **Two-Phase Locking (2PL)** управляет доступом к данным в базе данных, обеспечивая их корректность и изоляцию между транзакциями. 2PL работает по следующему алгоритму:
- **Фаза установки блокировок**: Транзакция может запрашивать блокировки для данных, которые она намерена использовать (чтение или запись).
- **Фаза снятия блокировок**: После начала снятия блокировок транзакция не может запрашивать новые блокировки.
Эти две фазы предотвращают конфликты и обеспечивают согласованное выполнение операций.
**Изменение данных (операция записи)**
- Запрашивается **блокировка на запись** (exclusive lock).
- Ожидается снятие всех блокировок, установленных до этой транзакции.
- Данные изменяются.
- Блокировка снимается.
**Чтение данных**
- Запрашивается **блокировка на чтение** (shared lock).
- Ожидается снятие всех блокировок на запись, установленных до этой транзакции.
- Данные считываются.
- Блокировка снимается.
**Важные особенности**
- **Блокировка на запись**. Она запрещает одновременно читать или изменять данные другим транзакциям.
- **Изоляция транзакций**. Согласно теореме 2PL, если все транзакции следуют этому протоколу, они будут изолированы друг от друга. Это значит, что каждая транзакция видит данные в состоянии, согласованном относительно её выполнения.
**Преимущества 2PL**
- **Сериализуемость транзакций**. Обеспечивает корректность выполнения операций.
- **Гарантированная изоляция**. Исключаются конфликты между транзакциями.
**Недостатки 2PL**
- **Ожидание блокировок**. Транзакция может быть вынуждена ждать, пока другие транзакции освободят ресурсы.
- Возможность [[deadlock]]. Две или более транзакции могут заблокировать друг друга, ожидая освобождения ресурсов.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Разработка|00 Разработка]]
**Родитель**:: [[Блокировка]]
**Источник**::
**Автор**::
**Создана**:: [[2024-06-20]]
### Дополнительные материалы
- [Two-phase locking - Wikipedia](https://en.wikipedia.org/wiki/Two-phase_locking)
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -1,11 +1,10 @@
--- ---
aliases: aliases:
- атомарность операции
- атомарность операций
tags: tags:
- maturity/🌱 - maturity/🌱
date: 2024-10-12 date: 2024-10-12
zero-link:
parents:
linked:
--- ---
Операция атомарная, если невозможно наблюдать частичный результат ее выполнения. Любой наблюдатель видит либо состояние системы до атомарной операции, либо после Операция атомарная, если невозможно наблюдать частичный результат ее выполнения. Любой наблюдатель видит либо состояние системы до атомарной операции, либо после
@ -13,6 +12,10 @@ linked:
- Запись в поле типа boolean, byte, short, char, int, Object всегда атомарна - Запись в поле типа boolean, byte, short, char, int, Object всегда атомарна
- Запись в поле типа long/double: атомарна запись старших и младших 32 бит - Запись в поле типа long/double: атомарна запись старших и младших 32 бит
- Запись в поле типа long/double, объявленное volatile, атомарна - Запись в поле типа long/double, объявленное volatile, атомарна
**Подходы:**
- [[Two-Phase Commit|Two-Phase Commit]]
- [[../../../../_inbox/Transactional Inbox|Transactional Inbox]]
*** ***
## Мета информация ## Мета информация
**Область**:: [[../../meta/zero/00 Разработка|00 Разработка]] **Область**:: [[../../meta/zero/00 Разработка|00 Разработка]]

View File

@ -52,5 +52,5 @@ linked:
### Дочерние заметки ### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) --> <!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
<!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) --> <!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
- [[Two Phase Lock]] - [[Two-Phase Locking]]
<!-- SerializedQuery END --> <!-- SerializedQuery END -->

View File

@ -8,9 +8,6 @@ tags:
- maturity/🌱 - maturity/🌱
date: date:
- - 2024-06-19 - - 2024-06-19
zero-link:
parents:
linked:
--- ---
Состояние гонки возникает, когда два или более потока одновременно пытаются получить доступ к одному и тому же ресурсу (например, переменной), причём хотя бы один поток изменяет его значение. В таких случаях порядок выполнения потоков не гарантирован, что приводит к непредсказуемому поведению программы. Например, один поток может записывать данные, в то время как другой — читать, что вызывает некорректные результаты. Состояние гонки возникает, когда два или более потока одновременно пытаются получить доступ к одному и тому же ресурсу (например, переменной), причём хотя бы один поток изменяет его значение. В таких случаях порядок выполнения потоков не гарантирован, что приводит к непредсказуемому поведению программы. Например, один поток может записывать данные, в то время как другой — читать, что вызывает некорректные результаты.

View File

@ -10,6 +10,7 @@ aliases:
- высоконагруженная система - высоконагруженная система
- высоконагруженных систем - высоконагруженных систем
- систем с высокой нагрузкой - систем с высокой нагрузкой
- высокой нагрузкой
--- ---
## Что такое HighLoad? ## Что такое HighLoad?
Например, один запрос в секунду это нагрузка явно не highload, любой сервер, вроде бы, справится. Но, например, если он перекодирует видеоролики, то тут может наступить highload. Например, один запрос в секунду это нагрузка явно не highload, любой сервер, вроде бы, справится. Но, например, если он перекодирует видеоролики, то тут может наступить highload.

View File

@ -27,6 +27,8 @@ aliases:
- [[00 HighLoad|HighLoad]] - [[00 HighLoad|HighLoad]]
- [[../../dev/architecture/Протоколы коммуникаций|Протоколы коммуникаций]] - [[../../dev/architecture/Протоколы коммуникаций|Протоколы коммуникаций]]
- [[../../dev/architecture/Интеграция информационных систем|Интеграция информационных систем]]
## Заметки ## Заметки
- На проекте вести архитектурные карты, где указаны связи между сервисами - На проекте вести архитектурные карты, где указаны связи между сервисами
## Полезное ## Полезное

View File

@ -9,6 +9,7 @@ aliases:
- базу данных - базу данных
- Реляционная база данных - Реляционная база данных
- базами данных - базами данных
- базы данных
linked: linked:
- "[[../../../../_inbox/00 In-memory СуБД|00 In-memory СуБД]]" - "[[../../../../_inbox/00 In-memory СуБД|00 In-memory СуБД]]"
--- ---