Re[7]: Про обработку ошибок - типовые решения
От: Sinclair Россия https://github.com/evilguest/
Дата: 27.04.25 13:31
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Говорите конкретно что не так.

Я вам конкретно сказал, что не так.
S>Он вышел, но программу не закрыл — старые операции продолжают работать. Механизма отмены нет.
Зачем они "продолжают работать", когда пользователь уже вышел?

S>Весь вопрос в том — как делать отмену. Будете ли вы встраивать в каждый сетевой запрос возможность отмены?

Я же вам вроде бы объяснял, что делать с отменой.
1. Не делать её вообще. Нет никакой разницы, вышел пользователь, или отключился, или у него на клиенте пропало питание. Действие на стороне сервера дорабатывает до конца.
2. Делать отмену на основе транзакционности. См. пример с MS SQL Server.

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

Поэтому придумали REST.

S>Так напишите как вы решите задачу:


S>1. Пользователь сделал запрос к серверу от имени Вася.

S>2. Пока идет запрос — пользователь Вася вышел и зашел под пользователем Петя. Программу не останавливали.
S>3. Пришел ответ запрос, но теперь текущий пользователь — Петя.
S>4. ?
Нет такой задачи. Вы её себе нафантазировали, и теперь огребаете.
Упростим ваш сложный сценарий%

1. Пользователь сделал запрос к серверу от имени Вася.
2. Пока идёт запрос — пользователь Вася вышел

Или так:

1. Пользователь сделал запрос к серверу от имени Вася.
2. Пока идёт запрос — пользователь Вася остановил программу

Или так:

1. Пользователь сделал запрос к серверу от имени Вася.
2. Пока идёт запрос — операционная система на клиентской машине аварийно завершила программу

Или так:

1. Пользователь сделал запрос к серверу от имени Вася.
2. Пока идёт запрос — клиентская машина аварийно завершилась (села батарея, отключилась сеть, и т.п.)

Внезапно оказывается, что если научиться обрабатывать одну из этих ситуаций, то автоматически получится ответ на все эти ситуации, и, заодно, на все более сложные сценарии вроде придуманного вами выше.
И способ — очень простой:
1. Пишем в локальную базу "мы собираемся сделать к серверу вот такой запрос" (атомарно)
2. Делаем запрос
3. Получив ответ на запрос, пишем в базу "на запрос получен вот такой ответ" (атомарно).

0. При старте системы, поднимаем из локальной базы список всех запросов, которые прошли через п.1 и не прошли через п.3. Повторяем для всех их них п.2 и 3.

Всё понятно?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.