Перейти к основному содержимому

Production architecture

После главы вы сможете собрать изученные contracts в deployment topology и объяснить failure/degradation каждого компонента.

Reference architecture

Это не обязательный набор microservices. В малой системе несколько boxes живут в одном process, но responsibilities и contracts всё равно различаются.

API boundary

API отвечает за:

  • authentication/tenant resolution;
  • request schema и idempotency request ID;
  • sync vs async contract;
  • streaming/status/cancel endpoints;
  • rate/size limits;
  • безопасную user-facing error semantics.

Не держите долгий run привязанным к одному HTTP connection. API может вернуть run_id, а client получать status/events/stream отдельно.

Queue и workers

Queue сглаживает spikes и позволяет retry delivery. Worker должен быть stateless относительно process memory: load run projection, acquire lease, сделать один/несколько bounded transitions, сохранить events, release.

Нужны:

  • visibility timeout/lease;
  • dedupe run/operation;
  • dead-letter и manual tooling;
  • priority/fairness per tenant;
  • cancellation propagation;
  • backpressure.

Queue at-least-once delivery усиливает необходимость idempotency.

Model gateway

Gateway скрывает vendor SDK и централизует:

  • auth/endpoints;
  • timeout/retry policy для inference;
  • model aliases/routing;
  • token/cost accounting;
  • content/data-region policy;
  • prompt/model version metadata;
  • fallback/circuit breaker.

Не превращайте gateway в god service, который знает domain workflow. ModelPort остаётся малой границей runtime.

State stores

Разные данные имеют разные lifecycle:

StoreДанныеИнвариант
Event/checkpointRun historyAppend/version/lease
ConversationUser-visible turnsRetention/access
Domain DBOrders/money/bookingsBusiness atomicity
MemoryScoped durable factsConsent/deletion
Retrieval indexDerived chunks/vectorsProvenance/version
TelemetrySpans/logs/metricsRedaction/retention
Eval datasetCurated cases/labelsVersion/leakage/access

Одна vector DB «для всей памяти» не заменяет эти semantics.

Tool plane и policy plane

Registry разрешает fully qualified/versioned capability. Policy использует trusted identity, actual arguments, effect class и current rule revision. Domain service финально обеспечивает invariant.

Для remote integrations может использоваться MCP/gateway, но transport не должен расширять authority.

Multitenancy

Tenant boundary проходит через весь call chain:

  • resolution на API;
  • queue partition/fairness;
  • state/memory/retrieval keys;
  • scoped credentials;
  • tool/domain queries;
  • telemetry redaction;
  • eval dataset access.

Tenant ID от модели игнорируется. Он приходит из authenticated execution context.

Budgets и admission control

До старта оцените допустимые:

  • concurrent runs;
  • max steps/tool calls;
  • token/cost;
  • wall time/deadline;
  • external writes;
  • retrieval size;
  • approval wait/expiry.

Admission control может отправить request в очередь, выбрать cheaper model/workflow или отказать до расхода ресурсов.

Model routing

Варианты:

  • один стабильный model baseline;
  • rule-based routing по risk/latency;
  • small classifier с abstain;
  • cascade: дешёвый model → evaluator → escalation;
  • ensemble/multiple trials только там, где eval доказывает benefit.

Routing — часть системы и должен оцениваться вместе с harness. Лучший model score не гарантирует лучший end-to-end outcome при другом tool/context interface.

Graceful degradation

СбойDegradation
Model provider unavailableFixed workflow/queue/human handoff
Retrieval downDomain tools + честно ограниченный ответ
Tool upstream downRetry/reconcile, не hallucinated success
Policy unavailableFail closed для writes, возможно reads
Telemetry downПродолжить по policy, буферизовать; recovery не ломается
Eval platform downНе блокировать active user run; блокировать risky release
Memory unavailableПродолжить без personalization, не cross-tenant fallback

Degradation заранее проектируется и тестируется. «Пусть модель импровизирует» — не fallback для unavailable ledger.

Release lifecycle

Версионируйте как единый system bundle:

  • model/parameters;
  • instructions/prompts;
  • tool schemas/descriptions;
  • workflow/policy;
  • retrieval index/corpus;
  • grader versions.

Путь: offline eval → shadow → canary → monitored rollout → rollback. Score сравнивается с latency/cost/safety, а не отдельно.

Multi-agent placement

Multi-agent — optional orchestration внутри worker plane. Каждый agent получает отдельный context/capability budget, а parent проверяет handoff. Нельзя позволять child расширять credentials или писать в общий state без concurrency contract.

Добавляйте только после baseline одного agent/workflow и измеримого выигрыша на tasks, где independent parallel exploration или security separation действительно нужны.

Варианты deployment

ВариантВыигрышЦенаКогда плохой выбор
Synchronous monolithБыстрый стартНет long-run resilienceApproval/voice/long tools
Async worker + DBХороший middle groundCustom timers/leasesОчень сложные sagas
Durable workflow platformRich lifecyclePlatform complexityМалый traffic/prototype
Managed agent platformБыстро/hosted toolsPortability/controlSpecial compliance/contracts

Helios и реальные аналоги

Helios объединяет marketplace, logistics, wallet и regulated support, но runtime core не знает lore. Domain adapters меняются; contracts model/tool/policy/event/eval остаются. Такой portfolio-проект показывает работодателю architecture transferability к fintech, marketplace, travel и telehealth.

Лаборатория

npm run demo:course
npm run test:course

Возьмите diagram и для каждого edge запишите timeout, identity, idempotency и observable outcome. Затем удалите один box: какие responsibilities нужно перенести, чтобы инварианты сохранились?

Self-check

  • Как API продолжает run после disconnect?
  • Где lease предотвращает concurrent worker?
  • Какой store authoritative для каждого типа данных?
  • Что происходит при policy/model/retrieval outage?
  • Как tenant identity доходит до DB?
  • Какие versions образуют release bundle?
  • Есть ли доказательство, что multi-agent сложность окупается?