166 lines
14 KiB
Markdown
166 lines
14 KiB
Markdown
# Автономное тройное ревью П36 · февраль 2021 · «Инвалидация кеша»
|
||
|
||
Статус: **принят независимым редактором в выпусковой набор**. В module ровно
|
||
три revision для стабильных slug:
|
||
|
||
- <code>editorial-2021-02-practice-cache-invalidation</code>;
|
||
- <code>editorial-2021-02-mechanism-cache-invalidation</code>;
|
||
- <code>editorial-2021-02-field-cache-invalidation</code>.
|
||
|
||
Revision не содержат <code>date</code> и <code>author</code>, не подключают
|
||
registry и не переписывают базовый архив. В этой авторской партии не менялись
|
||
<code>articles.json</code>, README, очередь, редакционный стандарт, package
|
||
config, Git и чужие незакоммиченные файлы.
|
||
|
||
## Проход 1. Факты, историческая рамка и техника — пройдено
|
||
|
||
| Утверждение или решение | Первичный / официальный источник | Зафиксированная граница |
|
||
| --- | --- | --- |
|
||
| В феврале 2021 RFC 7234 задавал HTTP cache key через method и target URI, а при content negotiation допускал selecting header fields | [RFC 7234, section 2 and 4.1](https://www.rfc-editor.org/rfc/rfc7234) | Текст использует это как дисциплину для key, но не называет <code>article:public:guide-42</code> HTTP key или API конкретного store. |
|
||
| После неошибочного ответа на unsafe request HTTP cache должен инвалидировать effective request URI; invalidation — удаление либо обязательная validation stored response | [RFC 7234, section 4.4](https://www.rfc-editor.org/rfc/rfc7234) | Статьи отдельно называют предел: запрос может пройти не через все caches, поэтому event не доказывает немедленную очистку каждого слоя. |
|
||
| <code>If-None-Match</code> делает request условным и для GET/HEAD может дать <code>304 Not Modified</code> при совпадении entity-tag | [RFC 7232, section 3.2](https://www.rfc-editor.org/rfc/rfc7232) | <code>sourceVersion</code> модели прямо отделена от ETag и HTTP header: это версия учебной записи одного owner. |
|
||
| HTTP freshness, validation и прикладная versioned invalidation отвечают на разные вопросы | [RFC 7234, sections 4.2–4.4](https://www.rfc-editor.org/rfc/rfc7234), [RFC 7232, sections 2.3 and 3.2](https://www.rfc-editor.org/rfc/rfc7232) | TTL не выдан за доказательство current source version; ни одна статья не обещает универсальную реализацию для Redis, CDN или framework. |
|
||
|
||
Во время независимой интеграционной вычитки смешанная буква в английском
|
||
глаголе осталась в таблице этого review; она исправлена на русское
|
||
«инвалидировать». Основной текст статьи уже разделял HTTP invalidation и
|
||
прикладной versioned contract.
|
||
|
||
### Техническая граница fixture
|
||
|
||
<code>runCacheInvalidationFixture()</code> создаёт один source object
|
||
<code>guide-42</code> и три последовательные версии только в <code>Map</code>:
|
||
|
||
1. public v1 строит <code>article:public:guide-42</code>;
|
||
2. public v2 записывается, но <code>ArticleChanged v2</code> намеренно не
|
||
применяется до следующего read;
|
||
3. этот read видит cached v1, сравнивает её с source v2 и возвращает rebuilt
|
||
public v2;
|
||
4. позднее event v2 оставляет уже current entry v2;
|
||
5. private v3 делает public read <code>not-visible</code> и удаляет old entry
|
||
ещё до delivery v3.
|
||
|
||
Проверены восемь assertions: initial v1 build, stale rebuild v2, сохранение
|
||
current entry поздним event, v2 hit, отсутствие <code>editorNote</code> в
|
||
public projection, deny private source до event, отсутствие public entry для
|
||
private event и использование только учебных объектов.
|
||
|
||
Fixture не открывает сеть, не вызывает broker, Redis, CDN, database, HTTP
|
||
stack или framework. Она не доказывает atomic write/event, retry, delivery,
|
||
cache eviction или production consistency. Это намеренное ограничение
|
||
соответствует формулировке статей.
|
||
|
||
Вердикт прохода: **пройден**. Нормы HTTP описаны с исторической датой, а
|
||
учебный contract не выдан за работу реальной инфраструктуры.
|
||
|
||
## Проход 2. Редактура, глубина и голос М4 — пройдено
|
||
|
||
| Revision | Симптом и цена в первых двух абзацах | Главный вопрос | Объём основного текста |
|
||
| --- | --- | --- | --- |
|
||
| Практика | Source уже обновлён, а читатель видит старую карточку; цена — показать не ту публичную проекцию или не вовремя скрыть материал | Как определить owner, public key, version, event и разрешённый hit | **8 882** знака body |
|
||
| Механизм | Source v2 известна, а cache v1 ещё не истекла по TTL; цена — отдать stale value после известного write | Почему version связывает source, event и entry, а TTL не заменяет этот contract | **9 903** знака body |
|
||
| Полевой разбор | Редактор видит новое значение, reader — старое; цена — очистить key вслепую и потерять evidence | Как отделить stale entry от wrong key, private source и другого read layer | **10 053** знака body |
|
||
|
||
- Отдельный ручной подсчёт после исключения code, figure и table дал
|
||
**7 321 / 8 239 / 7 492** знака чистой прозы. Значит, нижняя граница
|
||
выдержана не за счёт фрагментов кода и подписей к схемам.
|
||
- Во всех трёх материалах первые два абзаца дают симптом и цену, затем
|
||
держат порядок «симптом → причина → проверка → действие».
|
||
- У каждой revision больше пяти смысловых разделов, table с
|
||
<code>caption</code>/<code>thead</code>, figure с самостоятельными
|
||
<code>alt</code>/<code>figcaption</code>, минимум два технических примера,
|
||
нумерованный маршрут и две ссылки на RFC.
|
||
- Голос М4 / февраля 2021 прагматичен: owner, key, version, event, projection
|
||
и visibility всегда привязаны к конкретной операции. Автор уже связывает
|
||
данные с инфраструктурной границей, но не изображает себя владельцем
|
||
распределённой cache-платформы.
|
||
- Отдельно вычитаны анахронизмы и ложный опыт. В статьях нет выдуманного CDN,
|
||
cache hit-rate, данных пользователей, production-инцидента, real broker
|
||
delivery или универсального framework API.
|
||
- Каждый title и excerpt обещает ограниченный результат учебной модели, а не
|
||
«полное решение инвалидации» для любого стека.
|
||
|
||
Вердикт прохода: **пройден**. Объём и плотность соответствуют редакционному
|
||
стандарту; текст развивает автора от delivery и данных к одному проверяемому
|
||
contract чтения без техлидской позы 2027 года.
|
||
|
||
## Проход 3. Визуал, fixture и preflight — пройдено в границах пакета
|
||
|
||
- <code>cache-key-lifecycle-2021.svg</code> показывает полный порядок source
|
||
v2 → public key → delayed event → version guard → rebuilt public v2. В
|
||
первом рендере текст карточек соприкасался со стрелками; карточки были
|
||
увеличены, схема отрендерена и просмотрена повторно.
|
||
- <code>cache-consistency-matrix-2021.svg</code> сопоставляет пять состояний
|
||
source, cache и event с допустимым решением read, включая delayed v2 и
|
||
private v3.
|
||
- <code>cache-diagnosis-2021.svg</code> ведёт от stale title к evidence
|
||
packet и отделяет stale entry, wrong key, private source и renderer вне
|
||
кеша.
|
||
- У всех SVG есть <code>title</code>, <code>desc</code>, <code>role="img"</code>,
|
||
вертикальный viewBox, контрастные карточки и короткие строки. В них нет
|
||
JavaScript, <code>foreignObject</code>, external URL или raster data URI.
|
||
- После Sharp-рендера на ширине 375 px визуально просмотрены три финальные
|
||
PNG: <strong>375×719</strong>, <strong>375×641</strong> и
|
||
<strong>375×646</strong>. Clipping, наложения и горизонтальный overflow
|
||
внутри SVG не обнаружены.
|
||
|
||
### Фактически выполненные проверки
|
||
|
||
Команды запускались из <code>web/</code> после финальной редакторской правки:
|
||
|
||
<pre><code>node --check scripts/upgrade-2021-02.mjs
|
||
npm run audit:draft -- scripts/upgrade-2021-02.mjs
|
||
node scripts/upgrade-2021-02.mjs --verify-fixture
|
||
xmllint --noout \
|
||
public/assets/editorial/2021/cache-key-lifecycle-2021.svg \
|
||
public/assets/editorial/2021/cache-consistency-matrix-2021.svg \
|
||
public/assets/editorial/2021/cache-diagnosis-2021.svg</code></pre>
|
||
|
||
| Проверка | Реальный результат |
|
||
| --- | --- |
|
||
| <code>node --check</code> | PASS, code 0 |
|
||
| Import-safe export и draft gate | PASS: **8 882 / 9 903 / 10 053** знака body; найдены три slug, tables, figures, code, routes, sources и visual assets |
|
||
| In-memory fixture | PASS: все восемь assertions равны <code>true</code>; stale read пересобрал v2, late event v2 сохранил current entry, private v3 не выдан публичному reader |
|
||
| <code>xmllint --noout</code> | PASS, все три SVG — корректный XML |
|
||
| Sharp mobile preflight | PASS: финальные PNG 375 px просмотрены; первая схема исправлена после первоначального статического рендера |
|
||
| Scope/self-review | PASS: revision не меняют <code>date</code>/<code>author</code>; registry, archive, README, queue, standard, package config, Git и чужие untracked files не редактировались |
|
||
|
||
Не запускались настоящий source storage, cache store, Redis, CDN, broker,
|
||
database, HTTP server, browser, CI, production build, deployment, external
|
||
test stand или screen reader. Static SVG preflight не заменяет browser review,
|
||
accessibility audit и integration test выбранной инфраструктуры.
|
||
|
||
## Итог
|
||
|
||
Статус: **тройное авторское ревью пройдено; П36 принята к отдельной
|
||
публикации**.
|
||
|
||
Созданы ровно пять файлов:
|
||
|
||
1. <code>web/scripts/upgrade-2021-02.mjs</code>;
|
||
2. <code>editorial/reviews/2021-02-draft.md</code>;
|
||
3. <code>web/public/assets/editorial/2021/cache-key-lifecycle-2021.svg</code>;
|
||
4. <code>web/public/assets/editorial/2021/cache-consistency-matrix-2021.svg</code>;
|
||
5. <code>web/public/assets/editorial/2021/cache-diagnosis-2021.svg</code>.
|
||
|
||
## Независимая интеграционная приёмка
|
||
|
||
Основной редактор 31 июля 2026 года подключил три revision к
|
||
<code>web/data/editorial-revisions.mjs</code>, не меняя базовый
|
||
<code>articles.json</code>, даты или автора архивных записей. В registry стало
|
||
103 revision. RFC 7234 и RFC 7232 сверены независимо: в феврале 2021 они
|
||
задавали HTTP cache semantics, а учебная <code>sourceVersion</code> остаётся
|
||
прикладной моделью, не ETag и не API cache store.
|
||
|
||
| Проверка после интеграции | Реальный результат |
|
||
| --- | --- |
|
||
| Строгий audit трёх slug | PASS: 8 882 / 9 903 / 10 053 знака; у каждой статьи есть figure, table и code examples |
|
||
| Production build | PASS: Next.js собрал 374 статические страницы |
|
||
| Независимый mobile visual review | PASS: основной редактор повторно просмотрел три SVG после Sharp-рендера в 375 px; clipping, overlap и overflow не обнаружены |
|
||
|
||
Ни этот отчёт, ни интеграция не утверждают запуск source storage, cache store,
|
||
Redis, CDN, broker, HTTP server, browser или assistive technology.
|
||
|
||
Выпусковой вердикт: **ACCEPT**. Commit и push выполняются отдельной
|
||
публикационной операцией; Git остаётся источником её фактической записи.
|