Files
huncode 8cdf52e111
Build and deploy / deploy (push) Successful in 14s
revise March 2021 queue articles
2026-07-31 12:18:44 +03:00

15 KiB
Raw Permalink Blame History

Автономное тройное ревью П37 · март 2021 · «Очереди задач»

Статус: принят независимым редактором в выпусковой набор. Пакет содержит ровно три revision для стабильных slug:

  • editorial-2021-03-practice-queues;
  • editorial-2021-03-mechanism-queues;
  • editorial-2021-03-field-queues.

Созданы только пять разрешённых файлов П37:

  • web/scripts/upgrade-2021-03.mjs;
  • web/public/assets/editorial/2021/queue-message-lifecycle-2021.svg;
  • web/public/assets/editorial/2021/queue-delivery-guarantees-2021.svg;
  • web/public/assets/editorial/2021/queue-poison-diagnosis-2021.svg;
  • этот документ.

Revision-модуль экспортирует только изменяемые редакционные поля. В нём нет date, author или подключения registry. articles.json, README, очередь, package config и Git не изменялись. Команда --print-revisions печатает JSON из import-safe export; --verify-fixture выполняет контролируемую проверку только в памяти.

Проход 1. Факты и историческая рамка — пройдено

Утверждение Первичный или официальный источник Проверенная граница
AMQP 0-9 описывает delivery, отдельное acknowledgement и флаг redelivered; в руководстве для implementer есть рекомендация учитывать повторные доставки и переносить непригодный вход в dead letter queue AMQP 0-9 specification Статья использует это только как словарь доставки и повтора. Учебная 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 Линия существовала к марту 2021 года. В тексте нет переноса её топологии, названия policy или обещания сохранности terminal path на произвольный broker.
Версионная документация Kafka 2.7 разделяет delivery semantics, а API producer предупреждает, что retry может открыть duplicate Kafka 2.7 documentation, KafkaProducer 2.7.0 API Термины используются для разграничения delivery и domain effect. Модуль не запускает Kafka и не заявляет exactly-once или реальный delivery guarantee.

Весь пример создан в runQueueFixture(). Он берёт один неизменяемый учебный message id msg-order-417 и показывает две явно взаимоисключающие ветви, а не одну невозможную историю:

  • recovery: временное условие → controlled retry через 1000 мс → один записанный effect → duplicate после неизвестного статуса receipt → suppress duplicate и решение по этой delivery;
  • poison: отдельный учебный исход того же logical id → временно недоступная учебная проверка schema → ограниченная попытка → terminal reason training-schema-not-supported → manual-review с requiredCheck;
  • ledger: recovery ledger хранит один effectKey, 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 есть не менее пяти смысловых разделов, таблица с caption/thead, figure с содержательным alt/figcaption, два и более технических примера, нумерованный маршрут и четыре официальные ссылки.
  • М4 марта 2021 года проявляется в явных инвариантах и границах владельца: effectKey принадлежит эффекту, sequenceKey — доменному порядку, retry policy — договору обработки, manual record — владельцу следующего решения. Тон короткий и технический, без риторики зрелой event-platform.
  • Текст не обещает exactly-once. Понятия delivery, duplicate, effect и order разделены, а Map названа учебной моделью, а не транзакционным решением.
  • Отдельно вычитаны два опасных смешения: duplicate не отождествляется с причиной повторной доставки, а terminal route не отождествляется с удалением сообщения или завершённым ручным расследованием.

Вердикт прохода: пройден. Длина находится в диапазоне 5 000–15 000 знаков; новые навыки автора следуют из предыдущих материалов о delivery, ретраях, логах и диагностике, но не приписывают ему несуществующий опыт эксплуатации большой платформы.

Проход 3. Визуал, fixture и preflight — пройдено в пределах пакета

  • queue-message-lifecycle-2021.svg показывает полный учебный маршрут от конверта до ledger и manual route. После первого мобильного рендера сокращены длинные подписи delivery decision и retry, чтобы текст не обрезался на ширине 375 px.
  • queue-delivery-guarantees-2021.svg отделяет запуск consumer, effect ledger, suppress duplicate, решение delivery и terminal path.
  • queue-poison-diagnosis-2021.svg показывает дерево classification: известная временная причина идёт в ограниченный retry, terminal/unknown — в manual review; длинная подпись operator decision также сокращена после 375 px проверки.
  • Во всех трёх SVG есть title, desc и role="img"; вертикальный viewBox, контрастные карточки и исходный текст не мельче 21 px. Статическая проверка не нашла script, foreignObject, внешние URL или raster data URI.
  • Sharp отрендерил финальные SVG в PNG шириной 375 px. Результаты просмотрены вручную: заголовки, стрелки, карточки и нижние подписи читаются; clipping, overlap и горизонтальный overflow внутри схем не обнаружены. Это проверка статичного рендера, не browser-run и не проверка screen reader.

Фактически выполненные проверки

Финальное состояние пакета проверено 31 июля 2026 года:

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
Проверка Реальный результат
node --check 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 и явное разделение ветвей
xmllint --noout PASS, все три SVG — корректный XML
SVG safety scan PASS: не найдены script, foreignObject, внешние asset URL или raster data URI
Sharp mobile preflight PASS: три финальных PNG шириной 375 px просмотрены вручную; нет clipping, overlap или horizontal overflow внутри схем
Scope/self-review PASS: созданы только пять разрешённых файлов; registry, articles.json, README, очередь, package config и Git не менялись

npm run audit:draft завершилась с code 0. npm вывел старые предупреждения о пользовательских store-dir, cache-dir и public-hoist-pattern; эти конфигурации не относятся к П37 и не изменялись пакетом.

Не запускались: strict audit после подключения к registry, production build, browser, screen reader, реальный broker, SDK, HTTP, база, внешнее API, CI, deployment и публикация. Эти операции намеренно оставлены интегратору, потому что автономная партия не подключает registry и не меняет Git.

Независимая интеграционная приёмка

Основной редактор 31 июля 2026 года подключил три revision к web/data/editorial-revisions.mjs, не меняя базовый articles.json, даты или автора архивных записей. В 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 остаётся источником её фактической записи.