Про задачу 2 генералов в реальной жизни...
От: Shmj Ниоткуда  
Дата: 28.10.21 03:59
Оценка: 15 (1) :)
Вот тут, кто подзабыл: https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%B4%D0%B2%D1%83%D1%85_%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D0%BB%D0%BE%D0%B2

По идее эта задача считается неразрешимой.

Вопрос у меня вот в чем. Если я перевожу средства со счета в одном банке на счет в другом банке (очевидно у них разные СУБД и нельзя использовать локальную транзакцию). Канал передачи не надежен на 100% — очевидно — это глобальная сеть и сбои могут быть.

Но существует же алгоритм, благодаря которому имеем 100% достоверность, что действия будут согласованы и на 100% деньги не исчезнут одновременно с двух счетов а так же не удвоятся, не смотря на то что канал связи не надежен?

По идее так. Даю команду перевести 100 руб. на другой счет. Банк 1 сначала создает запись о переводе, уменьшает сумму на счете на 100 руб. Потом пытается связаться с внешним сервисом (пусть там другого банка или нац. банка — не важно) и при успешном ответе от него — уже фиксирует транзакцию. Если ответа нет — то делает запросы до победного конца (деньги будет блокировать, пока не внесется ясность).

Но тут какая проблема. Откуда банк 2 знает что банк 1 получил успешный ответ? Вдруг не получил? Значит банк 2 должен сделать запрос к банку 1. Но это очень похоже на задачу двух генералов этих, которая вроде как неразрешима.

Или же наличие ответственного в принятии решений как бы делает задачу разрешимой?

Вопрос вот в чем. Можно ли как-то таки эту задачу генералов решить не вероятностно (что согласованность получена с большой вероятностью) а точно? Поможет ли введение ответственного в принятии решений? И таки перевод средств из одной системы в другую (когда нет локальных транзакций, скажем так) по ненадежному каналу связи — решен вероятностно или же существует точное решение?
Отредактировано 28.10.2021 4:09 Shmj . Предыдущая версия . Еще …
Отредактировано 28.10.2021 4:04 Shmj . Предыдущая версия .
Отредактировано 28.10.2021 4:00 Shmj . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.