53 lines
6.8 KiB
Markdown
53 lines
6.8 KiB
Markdown
# Июль 2027 — техническая вычитка retry и идемпотентности
|
||
|
||
Три статьи разделяют решение о повторе, прикладную семантику операции и поля, которые позволяют расследовать исчерпанное время.
|
||
|
||
| Статья | Body без источников | Практический результат |
|
||
| --- | ---: | --- |
|
||
| <code>editorial-2027-07-practice-reliability-capstone</code> | 5 401 | локальный сервер 503 → 503 → 200 с общим deadline |
|
||
| <code>editorial-2027-07-mechanism-reliability-capstone</code> | 5 710 | локальный POST с idempotency key и одним resource id |
|
||
| <code>editorial-2027-07-field-reliability-capstone</code> | 5 677 | события попыток с remainingMs и decision |
|
||
|
||
## Проход 1 — факты, пример и источники
|
||
|
||
| Статья | До | После | Причина |
|
||
| --- | --- | --- | --- |
|
||
| Practice | Заголовок обещал общий deadline, а код ограничивал только число попыток. | В код добавлены deadline, вычисление остатка времени и <code>AbortSignal.timeout</code>; проверка метода сохранена. | Пример должен демонстрировать заявленный контракт, а не только цикл. |
|
||
| Mechanism | Локальный сервер мог создать впечатление полной дедупликации тела запроса. | В тексте прямо указано: учебный сервер читает только ключ; проверка тела, атомарность и срок хранения вынесены в ограничения. | Не выдавать Map за транзакционную реализацию. |
|
||
| Field | Событие содержало attempt и status, но не остаток времени. | Добавлено поле <code>remainingMs</code>, а fixture сохраняет отдельное состояние deadline. | Отделить исчерпанное время от ответа 503. |
|
||
|
||
Проверены первичные источники:
|
||
|
||
1. [RFC 9110 — HTTP Semantics](https://www.rfc-editor.org/rfc/rfc9110.html), IETF Standards Track, June 2022. Использован для safe/idempotent methods, статусов и <code>Retry-After</code>. Граница: RFC не выбирает retry policy конкретного API.
|
||
2. [RFC 9000 — QUIC](https://www.rfc-editor.org/rfc/rfc9000.html), 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 называет причину и действие. | Визуал стал полевым инструментом диагностики. |
|
||
|
||
<code>xmllint --noout</code> и SVG safety scan прошли для трёх файлов. Sharp отрендерил три изображения в ширине 375 px (<code>375×250</code> каждое); узлы, стрелки и нижние ограничения не обрезаны. Повторный scan 12-граммовых фрагментов с code включён, sources исключены: <code>0</code>.
|
||
|
||
## Итоговые проверки
|
||
|
||
- <code>node --check scripts/upgrade-2027-07.mjs</code> — PASS.
|
||
- <code>node scripts/upgrade-2027-07.mjs --verify-fixture</code> — PASS, <code>7/7</code>.
|
||
- <code>npm run audit:draft -- scripts/upgrade-2027-07.mjs</code> — PASS, 3/3 exact slugs.
|
||
- Три извлечённых примера запускаются локально: bounded retry, idempotency key и события попыток — <code>3/3</code>.
|
||
- Сквозное сравнение 349 материалов, 4 176 сравнений, sources исключены, code включён; совпадений — <code>0</code>.
|