多实例:共享状态与执行租约
持久化共享与进程内状态
启动要求 CONFIG_DB_URL 和 CONFIG_ENC_KEY,缺失时失败;InMemory 不再是这条生产启动路径的回退。数据库共享并不自动把所有进程内控制合成一个全局控制面。
文本 RunExecutionWorker 在 chat role 装配,Worker 这个职责名不表示独立部署角色。租户 RPM/RPD:配置 Redis(rateLimitRedisUrl)时跨实例共享计数、出错退回进程内;未配置时为进程内 Map,多实例分别计数。限额按租户覆盖 → 档位 → 全局默认解析。图表达代码的部署约束,没有推断实际线上副本数、Redis 配置或容量。
租户公平与背压(2026-10-14 钉点)
- Run 领取按配额桶(钉点
e2adc9a3c325,ADR-0095 MR5):计数单位是不可变的agent_runs.quota_bucket(推导规则见storage-planes)。foreground(会话顶层 turn)沿用单语句软上限(standard 2 / plus 4 / dedicated 8,可被租户覆盖;并发领取可短暂超出),前台 running 少的租户优先;uncounted(前台 child、scheduled、business task 等)不计不限,以免父等子死锁;只有 background 是硬上限(内置 1 / 2 / 4):候选行SKIP LOCKED后取(execution_scope, tenant, background)的pg_try_advisory_xact_lock,拿不到就跳过,再用独立语句复核 running 数。无 fairness 配置时前台 FIFO 不限,后台仍按 standard=1。实例级另有RUN_EXECUTION_BACKGROUND_CONCURRENCY(默认 1,0 禁用后台)。见视图quota-claim。 - 后台生产者已合入(STA-33 MR6-B/C/D,默认关):MR6-A 合同仍在;B 执行与控制循环、C 模板报告/通知/队列原因、D 租户门控生产者。
BACKGROUND_WORK_TENANT_POLICIES按租户enabled/biEnabled/longRunningCapabilityIds(未配置=关,只能收窄内置 8 能力白名单)。开启后前台忙或长跑能力时,只读 routed 查询可原子受理为已完成的conversation_turn交接 +background_work.v1root(回复「已收到,在后台处理。」);每会话最多 3 个活跃后台 root;本机执行/附件/插件/本地执行器永不进后台;BI 需biEnabled。迁移 186 为未完成后台 root 建部分索引。 - 租户资源档位表只有迁移草案(
docs/migration-drafts/tenant-resource-tiers-DRAFT.sql),解析器用to_regclass探测,表不存在时一律用内置 standard 档;档位维护仅平台超级管理员。租户角色模型(tenant-role-model.ts)目前只有纯函数与测试,未接入运行时;它的迁移原拟 170,现预留为 172(尚未提交、尚未执行;两份草案仍写 170,见storage-planes)。 - 配置变更经
pg_notify(aida_config_changed)跨实例失效;广播失败只告警,其他实例按缓存 TTL 收敛。 - 模型调用经 ProviderLimiter(默认在途 16、排队 64、等待 30s,
LLM_PROVIDER_*可调),排队满或超时返回LLM_BUSY背压。钉点e2adc9a3c325起排队按前台 / 后台两类各计上限、出队前台优先(桶取自 ALSrunQuotaBucket),后台即使部署关掉等待超时也保留默认期限。
后台工作合同与工具策略(MR6-A,d3b4881b1,钉点 e2adc9a3c325)
-
命令合同:
BackgroundWorkCommand(background_work.v1)进入共享 run 命令 union。payload 严格冻结 origin run / invocation、命令与请求摘要、输入消息边界、已接受路由、capability 指纹,effectCeiling=read_only、writeToolsAllowed=false,预算 600s、deadline 恰为受理后 2 小时;sourceFactRef=idempotencyKey=background-work:<originRunId>。createBackgroundWorkCommand只做纯构造。 -
工具交集规则:capability 白名单(hr / recruit / vms 查询类、onboarding 问答、
analytics.bi_query)→ 显式读工具列表 ∩ 当前已授权 Skill 声明 ∩ 已挂载的只读、风险 allow、租户可用、非插件、无需确认的工具,再排除reply_user/askUser/collectStructuredInput/request_file_access/confirm/request_confirmation/runSkillScript。BI 默认关:analytics.bi_query只有显式biBackgroundEnabled=true才有工具。已冻结的策略只能再收窄,摘要不符BACKGROUND_TOOL_POLICY_INVALID。 -
读侧:Work 视图新增
workKind: 'background_work.v1',带它的视图不能有pendingFileRequest/carrierBinding/publicProcess;执行快照按run_kind分到loadBackgroundWorkExecutionSnapshot。 -
生产者接线(本钉点):
ChatSubmissionStore在租户enabled且无本机/插件绑定时调用eligibleBackgroundRoute→admitBackgroundWorkInTx(见视图bg-admit)。createBackgroundWorkCommand/computeBackgroundToolPolicy由受理路径构造;默认关时生产流量仍走旧前台路径。 -
MR6 状态(本钉点):MR6-B/C/D 已合入 master;生产者默认关,需配置
BACKGROUND_WORK_TENANT_POLICIES。 -
档位草案:
tenant-resource-tiers-DRAFT.sql增加max_concurrent_background_runs(1–64,租户覆盖可空);草案未执行时用内置档位 1 / 2 / 4。 -
档位草案执行状态:发版顺序文档(2026-10-14)记为「未执行」,之后没有执行记录(migrations/README 与 202 执行记录都没有);库内实际状态读不到。证据:
aida-agent·docs/release/rollback-and-release-order.mdL29 ·tenant-resource-tiers·e2adc9a3c325 -
证据:
aida-agent·packages/tool-client/src/types/runtime-v2.tsL64–89 ·background_work.v1·e2adc9a3c325;aida-agent·packages/tool-client/src/types/runtime-v2.tsL204–218 ·background-work:·e2adc9a3c325;aida-agent·packages/tool-client/src/types/runtime-v2.tsL232–247 ·createBackgroundWorkCommand·e2adc9a3c325;aida-agent·packages/agent/src/runtime/work/background-work-policy.tsL7–47 ·analytics.bi_query·e2adc9a3c325;aida-agent·packages/agent/src/runtime/work/background-work-policy.tsL60–68 ·runSkillScript·e2adc9a3c325;aida-agent·packages/agent/src/runtime/work/background-work-policy.tsL115–173 ·computeBackgroundToolPolicy·e2adc9a3c325;aida-agent·packages/tool-client/src/types/runtime-execution.tsL272–301 ·workKind·e2adc9a3c325;aida-agent·packages/agent/src/runtime/work/run-work-execution-snapshot.tsL38–42 ·loadBackgroundWorkExecutionSnapshot·e2adc9a3c325;aida-agent·docs/migration-drafts/tenant-resource-tiers-DRAFT.sqlL10–14 ·max_concurrent_background_runs·e2adc9a3c325;aida-agent·docs/migration-drafts/tenant-resource-tiers-DRAFT.sqlL36–40 ·max_concurrent_background_runs·e2adc9a3c325
证据与范围
aida-agent·packages/agent/src/index.tsL1092–1112 ·test-only·e2adc9a3c325aida-agent·packages/agent/src/index.tsL2433–2443 ·executionWorker.start·e2adc9a3c325aida-agent·packages/agent/src/runtime/execution/run-execution-worker.tsL69–70 ·RunExecutionWorker·e2adc9a3c325aida-agent·packages/agent/src/gateway/quota.tsL37–67 ·TenantRateLimiter·e2adc9a3c325aida-agent·packages/agent/src/gateway/redis-tenant-rate-limiter.tsL137–170 ·createTenantRateLimiter·e2adc9a3c325aida-agent·packages/agent/src/runtime/execution/run-claim-quota.tsL78–86 ·tryReserveTenantRunSlot·e2adc9a3c325aida-agent·packages/agent/src/runtime/execution/run-execution-storage.tsL531–541 ·quota_bucket <> 'background'·e2adc9a3c325aida-agent·packages/agent/src/runtime/execution/run-execution-worker.tsL403–415 ·RUN_EXECUTION_BACKGROUND_CONCURRENCY·e2adc9a3c325aida-agent·packages/agent/src/tenant/resource-policy.tsL369–413 ·to_regclass·e2adc9a3c325aida-agent·packages/agent/src/config/config-change-bus.tsL54–64 ·publishConfigChange·e2adc9a3c325aida-agent·packages/agent/src/llm/provider-limiter.tsL12–44 ·LLM_BUSY·e2adc9a3c325
视图
main— 多实例共享状态与执行租约。quota-claim— 一次领取怎样按配额桶判定(前台软上限 / 后台硬上限 / uncounted 不限)。
结论来自固定版本的静态源码与合同阅读;实现存在、默认开关和生产启用分别判断。本站代码证据面板列出声明状态与具体限制。
- 本轮生产者证据:
aida-agent·packages/agent/src/shared/background-work-tenant-policy.tsL3–20 ·BACKGROUND_CAPABILITY_IDS·e2adc9a3c325;aida-agent·packages/agent/src/runtime/work/background-work-admission.tsL159–188 ·admitBackgroundWorkInTx·e2adc9a3c325;aida-agent·packages/agent/migrations/186_background_open_roots_index.sqlL56–70 ·idx_agent_runs_background_open_roots·e2adc9a3c325
产品口径旁挂(非本页机制)
本主题讲多实例共享状态、租户配额桶与后台生产者——不是 MSP 的产品定义。MSP = 原中台算薪运维等能力入产品(≠单纯多租户),见 product-narrative(2026-10-29)。
LLM Credits(钉点 e2adc9a3c325)
- 迁移 187 引入租户/用户 Credits 表与 identity
…-llm-credits。 - Gateway
admitChatCredits/creditsExhaustedResponse在 chat 受理路径扣减/拒绝。 - 与 ADR-0095 配额桶正交:Credits 是 LLM 用量账,quota_bucket 是 Run 领取桶。生产开通与共享库执行 未核实。