Сеть как часть приложения
Как повторить запрос, не создав вторую задачу?
Содержание слайдов
1. Сеть как часть приложения
Как повторить запрос, не создав вторую задачу?
2. Клиент не получил ответ, но задача существует
Синтетический случай: разрыв после фиксации.
3. Тайм-аут оставляет два допустимых исхода
Отсутствие ответа не устанавливает состояние хранилища.
4. Номер RPC и ключ операции решают разные задачи
Повтор клиента может пройти через новый процесс API.
5. Все попытки одного намерения несут один ключ
Ключ создаётся до первого сетевого вызова.
6. Ключ имеет область и срок памяти
В учебном namespace записи сохраняются до явной очистки.
7. Один ключ не должен менять содержимое
Повтор K с другим содержимым возвращает конфликт.
8. Два независимых шага пропускают дубликат
Оба обработчика могут увидеть отсутствие K.
9. Одна txn связывает задачу, ключ и 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 одной транзакцией.
Ограничить повторы общим бюджетом времени.