Ранас Мукминов – Оркестрация ИИ-агентов. Claude Opus 4.7 (страница 99)
Сообщение направлено получателю, которого не существует или который не забирает, и тихо исчезает. Источники: устаревший прямой адрес (получатель завершился); косвенная адресация, где никто не подписан на тему; класс сообщения, для которого нет обработчика; динамическая таблица, потерявшая запись. Чёрная дыра тем опаснее, чем тише: отправитель считает, что доставил, отслеживания недоставки нет, и пропажа обнаруживается, только когда отсутствие результата замечено где-то выше по течению. Защита смыкается с семантикой доставки (см. главу 29) — подтверждение приёма, тайм-аут ожидания обработки, мёртвая очередь (dead-letter) для сообщений, которые никуда не доставлены, — но начинается с требования полноты маршрутной таблицы: для каждого возможного адреса и класса должен существовать получатель или явный обработчик недоставки. Молчаливое отбрасывание неадресуемого сообщения — самый частый и самый трудно обнаруживаемый отказ маршрутизации.
Централизованный маршрутизатор, через который проходит весь поток роя, ограничивает пропускную способность (см. главу 57) и при отказе останавливает систему (см. главу 75). Это та же проблема, что у оркестратора, и те же средства: реплицировать маршрутизатор (с осторожностью к рассогласованию таблиц между репликами), вынести маршрутизацию в детерминированную среду доставки, где это возможно, и не пропускать через единый маршрутизатор потоки, которым он не нужен. Маршрутизатор на модели усугубляет проблему: он ещё и медленный и дорогой на каждое сообщение, поэтому централизованный маршрутизатор-агент на полном потоке — почти всегда узкое место.
Если маршрутизаторов несколько и каждый держит свою копию динамической таблицы, копии расходятся: один уже знает о завершении агента, другой ещё нет; один зарегистрировал новую способность, другой ещё нет. Одно и то же сообщение разные маршрутизаторы направят по-разному — недетерминизм, видимый только в распределённом случае и крайне трудно воспроизводимый при отладке (см. главу 80). Это частный случай проблемы согласованности общего состояния (см. главу 49), и решается он теми же средствами: единый авторитетный источник маршрутной таблицы либо явная модель согласованности с известными границами расхождения, а не молчаливое допущение, что копии одинаковы.
— Адресация — это отдельный уровень системы, а не деталь вызова. В одиночном агенте её нет; в рое между «произвёл сообщение» и «получил сообщение» лежит решение о том, кому оно предназначено, со своей топологией, стоимостью, отказами и поверхностью атаки. Спроектированный неявно, этот уровень становится скрытым источником связанности и недетерминизма.
— Полезно различать адрес (кому по смыслу), резолюцию (кто именно сейчас) и доставку (как туда). Эта глава — про адрес и резолюцию; семантика доставки — глава 29, доставка многим — глава 28.
— Модели адресации образуют спектр от прямой по идентификатору (жёсткая связь, полная предсказуемость, минимальная стоимость) до косвенной через общее пространство (максимальная развязка, нет гарантии доставки). Между ними — по роли, по способности, по содержанию. Здоровый рой применяет каждую там, где её обмен между развязкой и предсказуемостью оправдан, а не одну на всё.
— Маршрутизатор как компонент отличается от маршрутизатора-роли (см. главу 19): решение о направлении может жить в отправителе, в выделенном компоненте, в среде доставки или распределённо. Выбор места определяет наблюдаемость, отказоустойчивость и наличие единой точки отказа.
— Детерминированный маршрутизатор предсказуем, дёшев и воспроизводим, но направляет только по вычислимым признакам; маршрутизатор на модели гибче, но дорог, недетерминирован и ошибается правдоподобно. Канон — детерминизм везде, где признак вычислим из структуры, модель — только для подлинно неоднозначных сообщений.
— Топология адресации (звезда, дерево, плоскость, ячейка) — отдельное решение от топологии ролей и не обязана с ней совпадать. Несовпадение даёт свободу менять потоки, не меняя ответственность, ценой наблюдаемости: причинную цепочку приходится восстанавливать из записей маршрутизатора. Радиус доставки (один, подмножество, все) умножает риски маршрутизации и потому есть решение безопасности; широкая доставка по умолчанию опасна.
— Content-based routing — самый мощный режим и концентрат рисков. Принцип: классифицировать структурой везде, где отправитель может пометить сообщение, и осмыслять содержание только там, где классификация неизбежно требует понимания смысла. Его отказы — неверная классификация, дрейф, инъекция через содержание, стоимость на масштабе, неклассифицируемое сообщение.
— Маршрутизация — поверхность атаки: направление есть привилегия, и контроль над маршрутами есть контроль над потоками доверия. Маршруты к привилегированным получателям и к эгрессу должны быть детерминированными и неизменяемыми в рантайме; маршрутные решения должны быть наблюдаемыми, иначе misrouting, дрейф и инъекция не обнаруживаются до последствий.
— Общие отказы механизма направления — доставка не туда, петли (счётчик переадресаций и предел), чёрные дыры (полнота таблицы плюс мёртвая очередь и подтверждение приёма), узкое место и SPOF централизованного маршрутизатора, рассогласование таблиц между репликами. Каждый требует явной защиты; молчаливое отбрасывание неадресуемого сообщения — самый трудно обнаруживаемый из них.
Глава 28. Широковещание, подписки и события
Предыдущая глава разбирала адресную коммуникацию: отправитель знает получателя, маршрутизатор переводит логический адрес в конкретного исполнителя, сообщение идёт от одного к одному или к явно перечисленным многим (см. главу 27). Адресность даёт точность и трассируемость — видно, кто кому что отправил, — но она же создаёт связанность: отправитель должен знать, кому слать, а значит, зависит от существования, адресов и готовности получателей.
Эта глава о противоположном подходе. В модели «публикация — подписка» (publish/subscribe, далее pub/sub) отправитель не адресует сообщение получателю. Он публикует событие в общую тему (topic) — именованный канал, — и не знает, кто и сколько агентов это событие прочитает. Получатели независимо подписываются на интересующие их темы и получают всё, что туда публикуется, пока подписка активна. Между публикующими и подписанными стоит посредник — брокер (broker) или шина (bus), — который принимает публикации и доставляет их подписчикам. Отправитель развязан с получателями полностью: он знает только имя темы и схему события, но не знает ни числа подписчиков, ни их адресов, ни самого факта, что кто-то подписан.
Эта развязка — главная архитектурная ценность pub/sub и одновременно источник всех его рисков. С одной стороны, новый агент-подписчик подключается к рою, не затрагивая публикующих: достаточно подписаться на тему. Состав получателей становится изменчивым без переписывания отправителей — то самое свойство эволюционируемости, ради которого в главе 11 общую доску предпочитали адресной передаче, только здесь оно достигается через канал, а не через общее изменяемое состояние. С другой стороны, ровно та же развязка означает, что отправитель не получает обратной связи о доставке, не знает, обработано ли событие и кем, и не может рассчитывать на порядок. Связанность не исчезла — она сместилась в неявную зависимость от схемы события и от семантики темы, и эта неявность делает её более коварной, как и в случае со схемой доски (см. главу 11).
Pub/sub — это не топология в смысле части II, а способ коммуникации, который накладывается на любую топологию. В главе 14 он назван инфраструктурным слоем: содержательная иерархия или конвейер сверху, шина событий снизу. Эта глава разбирает архитектуру событийной координации, её отличие от адресного обмена, условия уместности и failure modes, которые принципиально отличаются от отказов адресных каналов — потому что отказывает здесь не канал между двумя узлами, а посредник, видимый всем, и подписка, которую отправитель не контролирует.
Четыре сущности образуют событийную координацию, и различие между ними — не терминологическая педантичность, а условие управляемости.
Событие (event) — сообщение о том, что нечто произошло. Это принципиальное смысловое отличие от адресной команды. Адресное сообщение в адресной топологии — обычно императив: «сделай то-то». Событие — констатация факта в прошедшем времени: «подзадача завершена», «артефакт готов», «обнаружено противоречие». Отправитель не предписывает получателям действие; он сообщает о случившемся, а получатели сами решают, реагировать ли. Эта переориентация с команды на факт — суть событийной модели: публикующий не управляет подписчиками, он лишь делает своё изменение состояния наблюдаемым. Событие самодостаточно: оно несёт всё необходимое для реакции, не требуя от подписчика обращаться обратно к источнику.
Тема (topic) — именованный канал, в который публикуются события определённого рода и схемы. Тема — это контракт: она задаёт, какие события сюда попадают и в каком формате. Подписчик, подписавшийся на тему, объявляет интерес именно к этому роду событий. Хорошо спроектированная тема имеет одну ясную семантику — «события завершения подзадач», «обнаруженные противоречия», — а не служит свалкой разнородных сообщений. Гранулярность тем — ключевое проектное решение: слишком крупная тема заставляет подписчиков получать и фильтровать лишнее, слишком мелкая дробит систему на сотни каналов, за которыми трудно следить.