Карта интернет-свободы в РФ
Насколько всё плохо именно в твоём городе?
Я собрал статистику блокировок по городам и провайдерам, и делюсь ей с вами!

В какой момент Telegram-бот имеет право сказать «задача отменена»?
Хочу разобрать мысленный эксперимент с Python + aiogram, PostgreSQL и несколькими воркерами. Бот собирает PDF. Пользователь может отменить работу и сразу запустить новую. Генерация долгая, сам файл отправляется через Telegram.
Неприятная гонка:
Воркер закончил PDF, проверил в базе: задача активна, версия диалога совпадает.
Начал отправлять документ. Сетевой запрос завис.
Пользователь нажал «Отменить». Бот записал отмену и ответил «Отменено».
Старый запрос завершился, PDF появился в чате уже после этого ответа.
Номер версии отсекает устаревшую работу до отправки, но между проверкой и внешним действием остаётся окно. Держать блокировку диалога на всё время загрузки тоже не хочется: тогда отмена сама ждёт сеть. Отмена Python-задачи ещё требует понять, успел ли удалённый сервис принять файл.
Я вижу два разных обещания пользователю. Первое: после подтверждения отмены новые действия по этой задаче не запускаются, но уже начатая отправка ещё может завершиться. Второе: после подтверждения в чате вообще не появится старый результат.
Первое проще честно описать. Для второго пока не понимаю, где провести границу между состоянием в базе и доставкой сообщения. Удаление уже пришедшего документа тоже не убирает момент, когда пользователь его увидел.
Какой контракт вы бы выбрали для такого бота и как реализовали бы его при нескольких воркерах? Интересует конкретный порядок действий при отмене, отправке и перезапуске процесса. И тест, который воспроизводит именно эту гонку, а не просто проверяет флаг cancelled.

Насколько всё плохо именно в твоём городе?
Я собрал статистику блокировок по городам и провайдерам, и делюсь ей с вами!
