文档

核心概念

Janus 是一个持久化 Agent 任务代理(Broker)。它位于 Agent 之间,以治理、路由和可观测性保障任务的可靠交付。

📡
Producer
Agent
Janus
Broker
🤖
Consumer
Agent
🗄️
PostgreSQL + NATS
持久化存储

架构总览

Janus 分为四层。外部客户端通过协议网关接入;无状态的核心服务负责任务生命周期、治理与后台 Worker;所有持久状态都外部化。每一层都可以独立扩展。

接入层只做协议适配。核心服务拥有状态机与治理。PostgreSQL 是事实来源;NATS 承载投递与事件;Redis 只保存心跳与速率计数。

接入层只做协议适配和认证 —— 不持有任何业务逻辑。核心服务拥有任务状态机、策略执行、预算核算和审计;它们无状态、可水平扩展。后台 Worker(Outbox 发布器、事件投影、租约扫描、心跳清扫)独立运行,通过数据库租约和幂等键协调,多个副本并行也不会重复投递。

PostgreSQL 是任务状态、事务性 outbox、预算和审计投影的事实来源。NATS JetStream 通过持久化流和按邮箱的消费者承载任务投递与领域事件。Redis 只保存 Agent 心跳和短窗口速率计数 —— 不存任何持久事实。

业务服务从不直接写邮箱。任务入队总是经过事务性 outbox,因此 acceptedqueued 之间发生崩溃也绝不会丢失任务。

任务(Task)

工作的基本单位。任务携带一个不透明载荷(信封 envelope),从源 Agent 发往目标消费者。每个任务都有唯一 ID、租户作用域,以及完整的生命周期状态:

pending  claimed  in_progress  completed
                                         failed
                                         nacked  pending (重试)
                                                   dlq

邮箱(Mailbox)

一个命名队列,任务在此投递。Agent 从自己拥有的邮箱拉取任务。邮箱是持久的——即使 Agent 崩溃,任务也会保留,直到 Agent 恢复并拉取它们。

关键属性:

租约(Lease)

Agent 拉取任务时,会获得一个限时租约。租约防止其他 Agent 抢占同一任务。如果 Agent 未确认(ACK)就崩溃:

信封(Envelope)

载荷包装器。包含:

路由与能力解析

Janus 通过五种目标类型把每个任务路由到正确的 Agent:

治理(Governance)

每一次任务派发都会经过策略与预算检查:

协议网关(Protocol Gateways)

Janus 原生支持多种 Agent 通信协议:

持久化模型(Durability Model)

任务被双写至 PostgreSQL(真相源)与 NATS JetStream(快速投递)。如果 Broker 进程中途崩溃:

租户隔离(Tenant Isolation)

每个任务、邮箱和工件都限定在租户内。跨租户访问会被自动拒绝。所有审计事件都带有租户 ID 标签。

Janus 使用双写持久化(PG + NATS)保障可靠性。Broker 能在 Agent 崩溃、网络分区乃至自身重启的情况下不丢失任何任务。