163 lines
15 KiB
Markdown
163 lines
15 KiB
Markdown
# Автономное тройное ревью П37 · март 2021 · «Очереди задач»
|
||
|
||
Статус: **принят независимым редактором в выпусковой набор**. Пакет содержит
|
||
ровно три revision для стабильных slug:
|
||
|
||
- <code>editorial-2021-03-practice-queues</code>;
|
||
- <code>editorial-2021-03-mechanism-queues</code>;
|
||
- <code>editorial-2021-03-field-queues</code>.
|
||
|
||
Созданы только пять разрешённых файлов П37:
|
||
|
||
- <code>web/scripts/upgrade-2021-03.mjs</code>;
|
||
- <code>web/public/assets/editorial/2021/queue-message-lifecycle-2021.svg</code>;
|
||
- <code>web/public/assets/editorial/2021/queue-delivery-guarantees-2021.svg</code>;
|
||
- <code>web/public/assets/editorial/2021/queue-poison-diagnosis-2021.svg</code>;
|
||
- этот документ.
|
||
|
||
Revision-модуль экспортирует только изменяемые редакционные поля. В нём нет
|
||
<code>date</code>, <code>author</code> или подключения registry.
|
||
<code>articles.json</code>, README, очередь, package config и Git не
|
||
изменялись. Команда <code>--print-revisions</code> печатает JSON из
|
||
import-safe export; <code>--verify-fixture</code> выполняет контролируемую
|
||
проверку только в памяти.
|
||
|
||
## Проход 1. Факты и историческая рамка — пройдено
|
||
|
||
| Утверждение | Первичный или официальный источник | Проверенная граница |
|
||
| --- | --- | --- |
|
||
| AMQP 0-9 описывает delivery, отдельное acknowledgement и флаг <code>redelivered</code>; в руководстве для implementer есть рекомендация учитывать повторные доставки и переносить непригодный вход в dead letter queue | [AMQP 0-9 specification](https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9.pdf) | Статья использует это только как словарь доставки и повтора. Учебная state machine не реализует AMQP, channel, ack API или настоящий dead-letter route. |
|
||
| RabbitMQ 3.8 был выпущен 11 ноября 2019 года; обзор этой линии упоминает poison-message feature и configurable delivery limit для quorum queues | [RabbitMQ 3.8 Release Overview](https://www.rabbitmq.com/blog/2019/11/11/rabbitmq-3-8-release-overview) | Линия существовала к марту 2021 года. В тексте нет переноса её топологии, названия policy или обещания сохранности terminal path на произвольный broker. |
|
||
| Версионная документация Kafka 2.7 разделяет delivery semantics, а API producer предупреждает, что retry может открыть duplicate | [Kafka 2.7 documentation](https://kafka.apache.org/27/documentation/#semantics), [KafkaProducer 2.7.0 API](https://kafka.apache.org/27/javadoc/org/apache/kafka/clients/producer/KafkaProducer.html) | Термины используются для разграничения delivery и domain effect. Модуль не запускает Kafka и не заявляет exactly-once или реальный delivery guarantee. |
|
||
|
||
Весь пример создан в <code>runQueueFixture()</code>. Он берёт один
|
||
неизменяемый учебный message id <code>msg-order-417</code> и показывает две
|
||
явно взаимоисключающие ветви, а не одну невозможную историю:
|
||
|
||
- **recovery**: временное условие → controlled retry через 1000 мс → один
|
||
записанный effect → duplicate после неизвестного статуса receipt →
|
||
suppress duplicate и решение по этой delivery;
|
||
- **poison**: отдельный учебный исход того же logical id → временно
|
||
недоступная учебная проверка schema → ограниченная попытка → terminal reason
|
||
<code>training-schema-not-supported</code> →
|
||
<code>manual-review</code> с <code>requiredCheck</code>;
|
||
- **ledger**: recovery ledger хранит один <code>effectKey</code>, poison
|
||
ledger остаётся пустым. Поэтому terminal ветвь не выдаётся за уже
|
||
совершённый эффект.
|
||
|
||
Это сознательно узкая модель. Она не моделирует transport, persistence,
|
||
consumer group, broker acknowledgement, реальную DLQ, внешнее API, базу,
|
||
транзакцию, сетевой сбой или права оператора. Ровно поэтому статья не называет
|
||
свою Map настройкой RabbitMQ/Kafka/SQS и не делает claim о delivery guarantee
|
||
за пределами инвариантов fixture.
|
||
|
||
Вердикт прохода: **пройден**. Исторические ссылки привязаны к источникам,
|
||
которые существовали к марту 2021 года; современный язык платформы не
|
||
подменяет границы учебного договора.
|
||
|
||
## Проход 2. Редактура, глубина и голос М4 — пройдено
|
||
|
||
| Revision | Симптом и цена в первых двух абзацах | Главный вопрос | Объём основного текста |
|
||
| --- | --- | --- | --- |
|
||
| Практика | Дубликат, нарушенный порядок и неподходящая схема появляются после первого consumer; цена — неизвестный сделанный effect и потерянный ручной контекст | Как записать контракт задачи до выбора consumer | **10 248** знака body |
|
||
| Механизм | Effect уже записан, но та же логическая задача приходит снова; цена — второй effect и неверный поиск «ошибки очереди» | Где проходит граница delivery, ledger и порядка | **11 280** знаков body |
|
||
| Полевой разбор | Один consumer бесконечно повторяет одинаковую ошибку; цена — заблокированная работа, шум и ручное удаление без контекста | Когда остановить retry и как передать решение человеку | **10 901** знака body |
|
||
|
||
- Каждый текст сохраняет последовательность «симптом → причина → проверка →
|
||
действие». Вводные не делают общих заявлений о важности очередей.
|
||
- В каждом revision есть не менее пяти смысловых разделов, таблица с
|
||
<code>caption</code>/<code>thead</code>, figure с содержательным
|
||
<code>alt</code>/<code>figcaption</code>, два и более технических примера,
|
||
нумерованный маршрут и четыре официальные ссылки.
|
||
- М4 марта 2021 года проявляется в явных инвариантах и границах владельца:
|
||
<code>effectKey</code> принадлежит эффекту, <code>sequenceKey</code> —
|
||
доменному порядку, retry policy — договору обработки, manual record —
|
||
владельцу следующего решения. Тон короткий и технический, без риторики
|
||
зрелой event-platform.
|
||
- Текст не обещает exactly-once. Понятия delivery, duplicate, effect и order
|
||
разделены, а Map названа учебной моделью, а не транзакционным решением.
|
||
- Отдельно вычитаны два опасных смешения: duplicate не отождествляется с
|
||
причиной повторной доставки, а terminal route не отождествляется с удалением
|
||
сообщения или завершённым ручным расследованием.
|
||
|
||
Вердикт прохода: **пройден**. Длина находится в диапазоне 5 000–15 000
|
||
знаков; новые навыки автора следуют из предыдущих материалов о delivery,
|
||
ретраях, логах и диагностике, но не приписывают ему несуществующий опыт
|
||
эксплуатации большой платформы.
|
||
|
||
## Проход 3. Визуал, fixture и preflight — пройдено в пределах пакета
|
||
|
||
- <code>queue-message-lifecycle-2021.svg</code> показывает полный учебный
|
||
маршрут от конверта до ledger и manual route. После первого мобильного
|
||
рендера сокращены длинные подписи delivery decision и retry, чтобы текст не
|
||
обрезался на ширине 375 px.
|
||
- <code>queue-delivery-guarantees-2021.svg</code> отделяет запуск consumer,
|
||
effect ledger, suppress duplicate, решение delivery и terminal path.
|
||
- <code>queue-poison-diagnosis-2021.svg</code> показывает дерево
|
||
classification: известная временная причина идёт в ограниченный retry,
|
||
terminal/unknown — в manual review; длинная подпись operator decision также
|
||
сокращена после 375 px проверки.
|
||
- Во всех трёх SVG есть <code>title</code>, <code>desc</code> и
|
||
<code>role="img"</code>; вертикальный viewBox, контрастные карточки и
|
||
исходный текст не мельче 21 px. Статическая проверка не нашла
|
||
<code>script</code>, <code>foreignObject</code>, внешние URL или raster
|
||
data URI.
|
||
- Sharp отрендерил финальные SVG в PNG шириной 375 px. Результаты просмотрены
|
||
вручную: заголовки, стрелки, карточки и нижние подписи читаются; clipping,
|
||
overlap и горизонтальный overflow внутри схем не обнаружены. Это проверка
|
||
статичного рендера, не browser-run и не проверка screen reader.
|
||
|
||
### Фактически выполненные проверки
|
||
|
||
Финальное состояние пакета проверено 31 июля 2026 года:
|
||
|
||
<pre><code>cd web && node --check scripts/upgrade-2021-03.mjs
|
||
cd web && npm run audit:draft -- scripts/upgrade-2021-03.mjs
|
||
cd web && node scripts/upgrade-2021-03.mjs --verify-fixture
|
||
cd web && xmllint --noout \
|
||
public/assets/editorial/2021/queue-message-lifecycle-2021.svg \
|
||
public/assets/editorial/2021/queue-delivery-guarantees-2021.svg \
|
||
public/assets/editorial/2021/queue-poison-diagnosis-2021.svg</code></pre>
|
||
|
||
| Проверка | Реальный результат |
|
||
| --- | --- |
|
||
| <code>node --check</code> | PASS, code 0 |
|
||
| Import-safe export и draft gate | PASS: **10 248 / 11 280 / 10 901** знака body; для трёх slug найдены sections, table, figure, code, route, sources и локальные assets |
|
||
| In-memory fixture | PASS: десять assertions истинны — один logical id, controlled retry, одна запись effect ledger, suppress duplicate, terminal manual path и явное разделение ветвей |
|
||
| <code>xmllint --noout</code> | PASS, все три SVG — корректный XML |
|
||
| SVG safety scan | PASS: не найдены <code>script</code>, <code>foreignObject</code>, внешние asset URL или raster data URI |
|
||
| Sharp mobile preflight | PASS: три финальных PNG шириной 375 px просмотрены вручную; нет clipping, overlap или horizontal overflow внутри схем |
|
||
| Scope/self-review | PASS: созданы только пять разрешённых файлов; registry, <code>articles.json</code>, README, очередь, package config и Git не менялись |
|
||
|
||
<code>npm run audit:draft</code> завершилась с code 0. npm вывел старые
|
||
предупреждения о пользовательских <code>store-dir</code>, <code>cache-dir</code>
|
||
и <code>public-hoist-pattern</code>; эти конфигурации не относятся к П37 и не
|
||
изменялись пакетом.
|
||
|
||
Не запускались: strict audit после подключения к registry, production build,
|
||
browser, screen reader, реальный broker, SDK, HTTP, база, внешнее API, CI,
|
||
deployment и публикация. Эти операции намеренно оставлены интегратору, потому
|
||
что автономная партия не подключает registry и не меняет Git.
|
||
|
||
## Независимая интеграционная приёмка
|
||
|
||
Основной редактор 31 июля 2026 года подключил три revision к
|
||
<code>web/data/editorial-revisions.mjs</code>, не меняя базовый
|
||
<code>articles.json</code>, даты или автора архивных записей. В registry стало
|
||
106 revision. AMQP 0-9, RabbitMQ 3.8 и Kafka 2.7 source material сверены
|
||
независимо: они поддерживают границы redelivery, poison/dead-letter route и
|
||
возможности duplicate, но не превращают Map из статьи в реальный broker или
|
||
end-to-end guarantee.
|
||
|
||
| Проверка после интеграции | Реальный результат |
|
||
| --- | --- |
|
||
| Строгий audit трёх slug | PASS: 10 248 / 11 280 / 10 901 знака; у каждой статьи есть figure, table и code examples |
|
||
| Production build | PASS: Next.js собрал 374 статические страницы |
|
||
| Независимый mobile visual review | PASS: основной редактор повторно просмотрел три SVG после Sharp-рендера в 375 px; clipping, overlap и overflow не обнаружены |
|
||
|
||
Ни этот отчёт, ни интеграция не утверждают запуск broker, SDK, HTTP, базы,
|
||
external API, browser или assistive technology.
|
||
|
||
Выпусковой вердикт: **ACCEPT**. Commit и push выполняются отдельной
|
||
публикационной операцией; Git остаётся источником её фактической записи.
|