Files
2026-07-31 22:26:56 +03:00

6.8 KiB
Raw Permalink Blame History

Июль 2027 — техническая вычитка retry и идемпотентности

Три статьи разделяют решение о повторе, прикладную семантику операции и поля, которые позволяют расследовать исчерпанное время.

Статья Body без источников Практический результат
editorial-2027-07-practice-reliability-capstone 5 401 локальный сервер 503 → 503 → 200 с общим deadline
editorial-2027-07-mechanism-reliability-capstone 5 710 локальный POST с idempotency key и одним resource id
editorial-2027-07-field-reliability-capstone 5 677 события попыток с remainingMs и decision

Проход 1 — факты, пример и источники

Статья До После Причина
Practice Заголовок обещал общий deadline, а код ограничивал только число попыток. В код добавлены deadline, вычисление остатка времени и AbortSignal.timeout; проверка метода сохранена. Пример должен демонстрировать заявленный контракт, а не только цикл.
Mechanism Локальный сервер мог создать впечатление полной дедупликации тела запроса. В тексте прямо указано: учебный сервер читает только ключ; проверка тела, атомарность и срок хранения вынесены в ограничения. Не выдавать Map за транзакционную реализацию.
Field Событие содержало attempt и status, но не остаток времени. Добавлено поле remainingMs, а fixture сохраняет отдельное состояние deadline. Отделить исчерпанное время от ответа 503.

Проверены первичные источники:

  1. RFC 9110 — HTTP Semantics, IETF Standards Track, June 2022. Использован для safe/idempotent methods, статусов и Retry-After. Граница: RFC не выбирает retry policy конкретного API.
  2. RFC 9000 — QUIC, IETF Standards Track, May 2021. Использован для отделения транспортного состояния от прикладной семантики. Граница: транспортный RFC не доказывает применение бизнес-операции.

Обе страницы отвечают HTTP 200. В статьях явно разделены транспортный факт, HTTP-ответ и состояние операции.

Проход 2 — структура, голос и плотность

Статья До После Причина
Practice Введение могло звучать как рекомендация «повторять всегда». Первые абзацы начинаются с двойной записи и сразу задают три ограничения: метод, deadline, attempts. Безопасность повторения должна быть условием, а не лозунгом.
Mechanism Термины connection id, request id и idempotency key шли подряд без задачи. Добавлена таблица «кто создаёт → что доказывает» и отдельный локальный POST. Термины привязаны к наблюдаемому действию.
Field Лог retry описывался через общий «сбой». Причина и decision разделены; добавлены примеры timeout, 503, 429 и POST. Событие должно подсказывать следующий безопасный запрос.

Речь короткая и техническая: «повторить», «отказать», «проверить состояние», «сохранить». Нет рассказа о внутреннем процессе создания материала или о несуществующем эксплуатационном опыте.

Проход 3 — визуал, доступность и повторы

Статья До После Причина
Practice Дерево решения не показывало deadline до проверки метода. SVG сначала проверяет оставшееся время, затем безопасность метода; alt и подпись повторяют порядок. Исправить причинность решения.
Mechanism Схема смешивала транспорт и бизнес-результат. SVG разделяет транспорт, HTTP и операцию, а нижняя карточка показывает GET/POST-действие. Не обещать транспортную гарантию бизнес-эффекта.
Field Loop выглядел как общий hand-off. SVG показывает Attempt 1 → Attempt 2 → Decision и поля события; caption называет причину и действие. Визуал стал полевым инструментом диагностики.

xmllint --noout и SVG safety scan прошли для трёх файлов. Sharp отрендерил три изображения в ширине 375 px (375×250 каждое); узлы, стрелки и нижние ограничения не обрезаны. Повторный scan 12-граммовых фрагментов с code включён, sources исключены: 0.

Итоговые проверки

  • node --check scripts/upgrade-2027-07.mjs — PASS.
  • node scripts/upgrade-2027-07.mjs --verify-fixture — PASS, 7/7.
  • npm run audit:draft -- scripts/upgrade-2027-07.mjs — PASS, 3/3 exact slugs.
  • Три извлечённых примера запускаются локально: bounded retry, idempotency key и события попыток — 3/3.
  • Сквозное сравнение 349 материалов, 4 176 сравнений, sources исключены, code включён; совпадений — 0.