Сеть как часть приложения
Как повторить запрос, не создав вторую задачу?
Содержание слайдов
1. Сеть как часть приложения
Как повторить запрос, не создав вторую задачу?
2. Клиент не получил ответ, но задача существует
Синтетический случай: разрыв после фиксации.
3. Тайм-аут оставляет два допустимых исхода
Отсутствие ответа не устанавливает состояние хранилища.
4. Call ID и ключ операции решают разные задачи
Повтор клиента может пройти через новый процесс API.
5. Все попытки одного намерения несут один ключ
Ключ создаётся до первого сетевого вызова.
6. Ключ имеет область и срок памяти
В учебном namespace записи сохраняются до явной очистки.
7. Один ключ не должен менять содержимое
Повтор K с другим содержимым возвращает конфликт.
8. Два независимых шага пропускают дубликат
Оба обработчика запроса могут увидеть отсутствие K.
9. Одна транзакция связывает задачу, ключ и outbox
etcd проверяет условие и применяет выбранную ветвь атомарно.
10. Конкурентные повторы делят один результат
Условие отсутствия K проходит только у победителя.
11. Перезапуск API не стирает ответ по ключу
Новый процесс восстанавливает ответ из etcd.
12. Подтверждение создания не означает выполнение задачи
Outbox сохраняет обязанность публикации.
13. Все попытки расходуют один дедлайн
Бюджет включает очередь, работу и повтор.
14. Отмена не откатывает завершённую транзакцию
Сигнал отмены может прийти слишком поздно.
15. Повтор зависит от причины и идентичности
Ошибку валидации повтор не исправляет.
16. Независимые повторы умножают нагрузку
Три слоя по три попытки дают до 27 обращений.
17. Случайная пауза разносит повторные попытки
Число попыток и общий дедлайн остаются ограниченными.
18. Очередь накапливает разницу скоростей
120 запросов/с при обслуживании 100 дают рост 20/с.
19. Приём ограничивают до дорогостоящей работы
Проектное расширение: конечные очередь и число обработчиков запросов.
20. Ограниченной очереди нужен реагирующий клиент
Отклонение без ограничения повторов переносит очередь наружу.
21. Первая попытка сохраняет три записи
Учебный трейс: K=blue, данные A, taskId=T7.
22. Повтор возвращает T7 и не создаёт новый outbox
Те же K и A проходят ветвь восстановления.
23. Проверка считает задачи, ключи и намерения
Успешный HTTP-повтор сам по себе недостаточен.
Один taskId для K
Одна задача и outbox
Другие данные → конфликт
Соответствие после перезапуска
24. Определите допустимые ответы трёх попыток
K=green; A и B различаются; первая фиксация состоялась.
25. Лабораторная проверяет один устойчивый результат
Python API, три узла etcd, будущая доставка через JetStream.
26. После лекции вы сможете
Различить повтор передачи и новую операцию.
Сохранить task, ключ и outbox одной транзакцией.
Ограничить повторы общим бюджетом времени.