Files
progcode/editorial/reviews/2021-04-draft.md
T
huncode c561263bfc
Build and deploy / deploy (push) Successful in 14s
revise April 2021 data consistency articles
2026-07-31 12:32:46 +03:00

171 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Автономное тройное ревью П38 · апрель 2021 · «Согласованность данных между сервисами»
Статус: **авторское тройное ревью пройдено, затем пакет принят независимым
редактором в выпусковой набор**. Пакет содержит три revision для стабильных
slug:
- <code>editorial-2021-04-practice-data-consistency</code>;
- <code>editorial-2021-04-mechanism-data-consistency</code>;
- <code>editorial-2021-04-field-data-consistency</code>.
Созданы только пять разрешённых файлов:
1. <code>web/scripts/upgrade-2021-04.mjs</code>;
2. <code>editorial/reviews/2021-04-draft.md</code>;
3. <code>web/public/assets/editorial/2021/data-consistency-state-machine-2021.svg</code>;
4. <code>web/public/assets/editorial/2021/data-consistency-compensation-2021.svg</code>;
5. <code>web/public/assets/editorial/2021/data-consistency-diagnosis-2021.svg</code>.
Revision-модуль экспортирует только изменяемые редакционные поля. В нём нет
<code>date</code>, <code>author</code> или подключения registry.
<code>articles.json</code>, README, очередь, стандарты, package config и Git
не менялись. Команды <code>--print-revisions</code> и
<code>--verify-fixture</code> предназначены только для import-safe проверки
этого пакета.
## Проход 1. Факты, историческая рамка и техника — пройдено
| Утверждение | Первичный или официальный источник | Проверенная граница |
| --- | --- | --- |
| Контекст события может включать <code>id</code>, <code>source</code> и <code>type</code>; version 1.0.1 CloudEvents уже существовала к апрелю 2021 года | [CloudEvents Specification v1.0.1: release record](https://github.com/cloudevents/spec/releases/tag/ce%40v1.0.1) | Учебный конверт заимствует только понятные поля. Он не является полной реализацией CloudEvents, transport binding или broker API. |
| PostgreSQL 13 документирует локальную transaction isolation, serialization failure и необходимость retry в соответствующих случаях | [PostgreSQL 13: Transaction Isolation](https://www.postgresql.org/docs/13/transaction-iso.html) | Это граница одной базы owner-а. Она не делает атомарными две базы, event delivery и внешний reserve API. |
| <code>INSERT ... ON CONFLICT</code> задаёт альтернативу для unique/exclusion constraint в одном PostgreSQL-хранилище | [PostgreSQL 13: INSERT](https://www.postgresql.org/docs/13/sql-insert.html) | <code>compensation_key</code> примера защищает повтор локального решения, а не доказывает cross-service consistency. |
| Kafka 2.7 отделяет producer idempotence и ограничивает её одной session, отдельно предупреждая о application-level resend | [KafkaProducer 2.7.0 API](https://kafka.apache.org/27/javadoc/org/apache/kafka/clients/producer/KafkaProducer.html) | Set event id fixture подавляет один duplicate event только в памяти; статьи не обещают exactly-once business effect. |
Технический сценарий намеренно ограничен одним учебным object id
<code>order-417</code>. Owner сначала находится в <code>paid v2</code>.
Проверенный учебный reason <code>training-reservation-rejected</code> даёт
owner-у право создать <code>cancelled v3</code> с единственным
<code>compensationKey</code>. Consumer получает v3 раньше v2, сохраняет
version gap, применяет v2 и затем replay-ит отложенную v3. Повтор v2/v3 не
создаёт новый state transition.
Инварианты fixture:
- owner не создаёт вторую компенсацию для того же <code>compensationKey</code>;
- consumer не меняет projection при gap и не двигает version назад;
- duplicate event id не создаёт второй state transition;
- <code>cancelled v3</code> не разрешает следующий эффект
<code>readyToShip</code>.
Fixture использует только Array, Map и Set одного Node-процесса. Она не
запускает database, broker, HTTP service, external reserve, real order,
transaction manager или distributed delivery. Компенсирующее действие в
статьях описано как паттерн решения owner-а, не как единый стандарт или
готовая platform capability.
Вердикт прохода: **пройден**. Источники существовали к апрелю 2021 года, а
проверенные факты не расширены до обещания общей транзакции, готового
distributed workflow или exactly-once business effect.
## Проход 2. Редактура, глубина и голос М4 — пройдено
Final draft audit подтвердил объём 5–15 тыс. знаков. Тексты держат короткую
прагматичную речь
«симптом → причина → проверка → действие» и М4 апреля 2021 года: ownership,
инвариант, evidence и ограниченная компетентность вместо claims о
распределённой платформе.
| Revision | Симптом и цена в первых двух абзацах | Главный вопрос | Итоговый объём |
| --- | --- | --- | --- |
| Практика | owner и fulfillment показывают разные versions; цена — совершить отгрузку или другой effect по отставшей проекции | Как назвать owner, инвариант следующего действия и границу eventual consistency | **10 294** знака body |
| Механизм | v3 приходит до v2 и duplicate повторяется; цена — перепрыгнуть переход, откатить projection назад или создать вторую компенсацию | Почему event id, version и compensation key нельзя заменить одним идентификатором | **10 790** знаков body |
| Полевой разбор | статусы расходятся, оператору хочется переписать их вручную; цена — потерять evidence и получить второй effect | Как собрать evidence packet и выбрать безопасное действие до replay | **11 728** знаков body |
Редакторский проход подтвердил:
- table с <code>caption</code>/<code>thead</code>, figure с содержательным
<code>alt</code>/<code>figcaption</code>, не менее двух технических
примеров и нумерованный маршрут в каждой revision;
- явное различение owner state, consumer projection, version gap, duplicate
event и compensation key;
- отсутствие claims о реальных заказах, замеренном lag, exactly-once,
production delivery и зрелой distributed platform;
- отсутствие анахронизма: источники и версия Kafka/PostgreSQL/CloudEvents
существовали к апрелю 2021 года, а паттерн не выдан за стандарт.
Вердикт прохода: **пройден**. Все три материала начинают с наблюдаемого
расхождения и цены, затем дают конкретный owner/инвариант/evidence/route.
Риторическая формулировка про «магический rollback» была заменена до финального
audit на точное описание ложной границы компенсации.
## Проход 3. Визуал, fixture и preflight — пройдено
Три SVG подготовлены как вертикальные схемы для 375 px:
- state machine отделяет owner v2/v3 от отложенной consumer projection;
- compensation показывает проверенный reason, локальный key и новое owner
решение;
- diagnosis ведёт от блока рискованного effect к evidence packet, version
branch и контролируемому действию.
Во всех SVG предусмотрены <code>title</code>, <code>desc</code> и
<code>role="img"</code>; отсутствуют JavaScript, <code>foreignObject</code>,
external URL и raster data URI. В первой статической проверке нижняя подпись
state machine оказалась слишком длинной для 375 px; она сокращена, SVG
отрендерен и просмотрен повторно.
<pre><code>cd web &amp;&amp; node --check scripts/upgrade-2021-04.mjs
cd web &amp;&amp; npm run audit:draft -- scripts/upgrade-2021-04.mjs
cd web &amp;&amp; node scripts/upgrade-2021-04.mjs --verify-fixture
cd web &amp;&amp; xmllint --noout \
public/assets/editorial/2021/data-consistency-state-machine-2021.svg \
public/assets/editorial/2021/data-consistency-compensation-2021.svg \
public/assets/editorial/2021/data-consistency-diagnosis-2021.svg</code></pre>
| Проверка | Реальный результат |
| --- | --- |
| <code>node --check</code> | PASS, code 0 |
| Import-safe export и draft gate | PASS: итоговые **10 294 / 10 790 / 11 728** знаков body; для всех трёх slug найдены sections, table, figure, code, route, sources и локальные SVG |
| In-memory fixture | PASS: итоговые десять assertions равны <code>true</code>; v3 сначала defer, затем v2 и replay v3; duplicate не меняет projection; другой event с занятой version отклоняется; компенсация записывается один раз; cancelled не разрешает effect |
| <code>xmllint --noout</code> | PASS, все три SVG — корректный XML |
| SVG safety scan | PASS: не найдены <code>script</code>, <code>foreignObject</code>, external URL или raster data URI |
| Sharp mobile preflight | PASS: финальные PNG <strong>375×656</strong>, <strong>375×667</strong> и <strong>375×719</strong> просмотрены вручную; clipping, overlap и horizontal overflow внутри схем не обнаружены |
| Scope/self-review | PASS: созданы только пять разрешённых файлов; revision не меняют <code>date</code>/<code>author</code>; registry, archive, README, очередь, standard, package config, Git и чужие untracked files не редактировались |
<code>npm run audit:draft</code> завершилась с code 0. npm вывел старые
предупреждения о пользовательских <code>store-dir</code>, <code>cache-dir</code>
и <code>public-hoist-pattern</code>; они не относятся к П38 и не менялись
пакетом.
До независимой интеграции автономный автор не заявлял strict registry audit,
production build, browser, screen reader, database/broker/API checks,
deployment, commit или push.
## Независимая интеграционная приёмка
Основной редактор 31 июля 2026 года подключил три revision к
<code>web/data/editorial-revisions.mjs</code>, сохранив базовый
<code>articles.json</code>, даты и автора архивных записей. В registry стало
109 revision, строгий аудит проходит 118 из 358 материалов.
В независимом техническом проходе найден один риск в учебном guard: новый
event с уже занятой <code>orderVersion</code>, но с другим <code>id</code>,
мог бы изменить projection. До выпуска guard был уточнён: сначала проверяется
<code>subject</code>, затем такой event возвращает
<code>same-version-event-rejected</code>; конфликт в отложенной версии также
не перезаписывает evidence. Fixture получила десятый assertion, а механизм и
полевой маршрут — явное правило не выбирать конфликт по времени получения.
Это изменение не выдаётся за transport guarantee.
CloudEvents release record подтверждает выпуск 1.0.1 в декабре 2020 года;
версионная документация PostgreSQL 13 подтверждает границы локальной
изоляции и retry при serialization failure; Kafka 2.7 отдельно ограничивает
producer idempotence одной session и не дедуплицирует application-level
re-send. Эти источники сверены независимо и использованы только в названных
границах.
| Проверка после интеграции | Реальный результат |
| --- | --- |
| Import-safe export | PASS: три revision, без <code>date</code>/<code>author</code> |
| Строгий audit трёх slug | PASS: **10 294 / 10 790 / 11 728** знаков; у каждой статьи есть figure, table и code examples |
| Fixture после редакторского исправления | PASS: все 10 assertions истинны, включая rejection другого event с той же version |
| Независимый SVG review | PASS: XML и active/external asset scan прошли; три PNG 375 px просмотрены повторно, clipping, overlap и overflow не обнаружены |
| Production build | PASS: Next.js собрал 374 статические страницы |
Ни этот отчёт, ни интеграция не утверждают запуск broker, SDK, HTTP, базы,
external API, browser или assistive technology.
Выпусковой вердикт: **ACCEPT**. Commit и push выполняются отдельной
публикационной операцией; Git остаётся источником её фактической записи.