The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Раздел полезных советов: Гарантия консистентности двух и более состояний"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Гарантия консистентности двух и более состояний"  +/
Сообщение от auto_tips (??), 22-Окт-24, 12:16 
++ Статья

*** описывает проблему гарантии полноты и неизбыточности при последовательной установке двух состояний;
*** выдвигает гипотезу о невозможности разрешения проблемы без участия состояний (без идемпотентности состояний);
*** предлагает Общее решение.

++ Задача

*** Поток T должен установить два состояния S1 и S2.
*** S1 и S2 возвращают синхронный ответ при успехе сохранения и не более.
*** Требуется гарантировать полноту и не избыточность установки состояний.

++ Проблема

*** Поток Т выполняет запись в S1.
*** При провале поток Т возвращает отказ.
*** При успехе поток Т должен выполнить запись в S2.
*** Начиная с этого момента возникает проблема неопределенности при ошибке установки S2 или крахе потока Т, состояние S1 уже установлено, а S2 не установлено; однозначно не определен результат исполнения потока T; повторный вызов потока Т не разрешит ситуацию.

++ Гипотеза

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

Никакие механизмы со стороны Т не могут разрешить указанную проблему без идемпотентности S1.

++ Варианты решения

*** Состояние S1 должно быть идемпотентным например: защита от дублированного получения данных; возможность оповещения T по его инициативе о результатах сохранения.
*** T должен обладать возможностью повтора установки состояний при отказе.

[[IMG /opennews/pics_base/CFD0C5CECEC5D4_1728724620.png]]


++ Общее решение гарантии консистентности состояний

Ниже перечислены рассматриваемые виды состояний:

*** S - (simple state) простое состояние без поддержки транзакций и идемпотентности, например: очереди сообщений (kafka, итд); внешние сервисы; базы без идемпотентных проверок, с триггерами или автокоммитом; журналирование.
*** I - (idempotent state) - состояние с поддержкой идемпотентности: базы данных; сервисы; файлы.
*** T - (transact state) - состояния, поддерживающие транзакционную целостность: базы данных TSQL.

++ Возможные комбинации

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

Обязательным условием является повтор вызова потока при отказе на любой стадии.

Пример:

Поток получает сообщение из очереди, которая гарантирует повторяемость.
Вызов потока из UI не гарантирует повторяемость события, так как пользователь получив ошибку, может не выполнить повторное действие.

++ SS
    
*** Гарантия консистентности: нет
*** Пример: Push сообщения в очередь; Write в журнал
*** Последствия: Накопление дублей сообщений в очереди

++ SI
    
*** Гарантия консистентности: нет
*** Пример: Commit сообщения очереди; Идемпотентный вызов сервиса
*** Последствия: Отсутствие гарантии вызова сервиса

++ ST

*** Гарантия консистентности: нет
*** Пример: Commit сообщения очереди; Insert в базу
*** Последствия: Накопление дублей сообщений в очереди

++ IS

*** Гарантия консистентности: да
*** Пример: Insert с предпроверкой в базу; Commit сообщения очереди
*** Последствия: Многократные попытки Insert

++ II
    

*** Гарантия консистентности: да
*** Пример: Insert с предпроверкой в базу; Update с предпроверкой в базу
*** Последствия: Многократные попытки Insert

++ IT

*** Гарантия консистентности: да
*** Пример: Вызов внешнего сервиса; Запись в базу
*** Последствия: Многократный вызов внешнего сервиса

++ TS
    
*** Гарантия консистентности: нет
*** Пример: Insert в базу; Push в очередь
*** Последствия: Накопление дублей в БД

++ TI

*** Гарантия консистентности: нет
*** Пример: Insert в базу; Запись с предпроверкой в базу
*** Последствия: Накопление дублей в БД

++ TT

*** Гарантия консистентности: нет
*** Пример: Insert в базу; Запись в базу в одной транзакции
*** Последствия: Полный откат транзакции
    

++ Общие правила гарантии сохранения состояний

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

++ Ccылки

[[https://github.com/johnthesmith/scraps/blob/main/ru/state_co... статья на github]]

URL:
Обсуждается: http://www.opennet.dev/tips/info/3256.shtml

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


1. "Гарантия консистентности двух и более состояний"  +/
Сообщение от Аноним (1), 22-Окт-24, 12:16 
Напоминает оксюморон, мозможно, требует корректировки терминов и/или лучшего разъяснения, что имеет в виду автор.

Идемпотентность - способность возвращать тот же результат при повторных вызовах, вроде реентерабельности функций.
"Состояние" (в программировании) - как раз то, что нарушает реентерабельность/идемпотентность.

Видеть эти два слова вместе, да ещё и говорить об "идемпотентности состояния". Напоминает оксюморон...

Ответить | Правка | Наверх | Cообщить модератору

2. "Гарантия консистентности двух и более состояний"  +4 +/
Сообщение от Илья (??), 23-Окт-24, 08:34 
Ещё бы знать, что такое оксюморон. Это же реп какой-то гавённый?
Ответить | Правка | Наверх | Cообщить модератору

5. Скрыто модератором  +2 +/
Сообщение от Аноним (-), 26-Окт-24, 16:44 
Ответить | Правка | Наверх | Cообщить модератору

3. "Гарантия консистентности двух и более состояний"  +1 +/
Сообщение от Анонон (?), 25-Окт-24, 17:58 
Ну это понятно, код в студию
Ответить | Правка | Наверх | Cообщить модератору

4. "Гарантия консистентности двух и более состояний"  +1 +/
Сообщение от Cupeeb (?), 26-Окт-24, 11:48 
Судя по выводам для TT гарантия консистентности должна стоять - ДА
Ответить | Правка | Наверх | Cообщить модератору

6. "Гарантия консистентности двух и более состояний"  +1 +/
Сообщение от stillswamp (ok), 27-Окт-24, 00:31 
Верная правка. Спасибо.
Ответить | Правка | Наверх | Cообщить модератору

7. "Гарантия консистентности двух и более состояний"  +1 +/
Сообщение от Аноним (7), 01-Ноя-24, 02:10 
CAP theorem
Ответить | Правка | Наверх | Cообщить модератору

8. "Гарантия консистентности двух и более состояний"  +/
Сообщение от Аноним (8), 04-Ноя-24, 19:27 
Есть целая книжка (в том числе и) про это. Называется «Designing Data-Intense Applications», автор Mertin Kleppmann. Рекомендую всем, кому приходится иметь дело с распределёнными системами, особенно в контексте консистентности и упорядочивания событий.
Ответить | Правка | Наверх | Cообщить модератору

9. "Гарантия консистентности двух и более состояний"  +/
Сообщение от Аноним (8), 04-Ноя-24, 19:28 
* Martin Kleppmann конечно же.
Ответить | Правка | Наверх | Cообщить модератору

10. "Гарантия консистентности двух и более состояний"  +/
Сообщение от Аноним (10), 17-Ноя-24, 21:17 
Статья неплохая, но как мне кажется робкая и с оговорками. "За деревьями не видеть леса" - явно не про автора, но ведь можно описать лес просто как набор деревьев погуще, чтобы никого не волновать раньше времени. Как классифицировать статью? Мне кажется лучше всего ей подходит древняя как мир категория: Elephant in the room, с подкатегорией: "слон прикреплен цепями к полу, ключ не у нас"
Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру