12.8 消息关联、审计与 SLA

workflow 引擎层和 workflow-pro 业务层共同提供了消息关联匹配(`MessageCorrelation`)、审计追踪(`AuditTrail`)、消息代理抽象(`IMessageBroker`)和 SLA 监控(`SlaTracker`)等可观测性和集成能力。

MessageCorrelation — 消息关联匹配

`MessageCorrelation` 实现 `IEdgeCondition`,通过关联键(`CorrelationKey`)将入站消息与等待中的流程实例匹配。

关联键定义

use rust_agent_workflow::engine::{CorrelationKey, MessageCorrelation};

// 通过业务主键关联
let key = CorrelationKey::by_business_key("order-12345");
// 通过流程实例 ID 关联
let key = CorrelationKey::by_process_id("proc-abc");
// 自定义多键组合(AND 逻辑)
let key = CorrelationKey::by_business_key("order-12345")
    .with_custom_key("type", "payment")
    .with_custom_key("channel", "web");

// 创建关联器(可选超时)
let correlation = MessageCorrelation::new(key)
    .with_timeout(Duration::from_hours(1));

// 作为 IEdgeCondition 附加到边上
builder = builder.add_edge_with_condition(
    "source",
    "message_handler",
    Arc::new(correlation),
);

匹配规则

从 `MessageEnvelope.metadata` 中查找关联字段(AND 逻辑全部匹配):

| 关联键 | envelope metadata 字段 | |--------|----------------------| | `business_key` | `"business_key"` | | `process_id` | `"process_id"` | | `custom_keys` | 对应 key 的 metadata 字段 |

// ReceiveTask 使用示例
let msg_env = MessageEnvelope::new("source", msg, TypeTag::new("test"))
    .with_metadata("business_key", json!("order-12345"))
    .with_metadata("type", json!("payment"));

let key = CorrelationKey::by_business_key("order-12345")
    .with_custom_key("type", "payment");
assert!(key.matches(&msg_env));  // → true

超时支持

`MessageCorrelation` 内置超时检测:

let correlation = MessageCorrelation::new(key)
    .with_timeout(Duration::from_secs(30));

correlation.start();              // 开始计时
// ... 等待消息 ...
correlation.is_timed_out();       // 检查是否超时
correlation.reset();              // 重置计时器

IMessageBroker — 消息代理抽象

外部消息中间件(Kafka、RabbitMQ、Redis 等)的集成接口。

use rust_agent_workflow_pro::IMessageBroker;

#[async_trait]
pub trait IMessageBroker: Send + Sync {
    // 发布消息到指定主题
    async fn publish(
        &self, topic: &str, payload: &serde_json::Value,
        headers: Option<HashMap<String, String>>,
    ) -> Result<(), String>;

    // 订阅指定主题
    async fn subscribe(&self, topic: &str)
        -> Result<Box<dyn MessageReceiver>, String>;

    // RPC 请求模式(发后等回)
    async fn request(
        &self, topic: &str, payload: &serde_json::Value,
        timeout_ms: u64,
    ) -> Result<serde_json::Value, String>;

    // 健康检查
    async fn health_check(&self) -> bool;
}

InMemoryMessageBroker

框架内置内存实现,用于测试和简单场景:

use rust_agent_workflow_pro::message::broker::InMemoryMessageBroker;

let broker = InMemoryMessageBroker::new();

// 发布
broker.publish("orders", &json!({"id": 123}), None).await?;

// 订阅
let mut receiver = broker.subscribe("orders").await?;
let msg: Option<ReceivedMessage> = receiver.recv(1000).await?;

AuditTrail — 审计追踪

`AuditTrail` 消费 `WorkflowEvent` 流,将关键事件转换为 `AuditEntry` 记录持久化。

use rust_agent_workflow_pro::AuditTrail;

let trail = AuditTrail::new(1000);  // 保留最近 1000 条

// 记录 Info 事件
trail.info("proc-1", "node_exec", "Node started");

// 记录 Error 事件
trail.error("proc-1", "node_exec", "Node failed");

// 查询指定流程的所有审计条目
let entries: Vec<AuditEntry> = trail.entries_for("proc-1");
// → 按 process_id 过滤

// 查看全部
let all: Vec<AuditEntry> = trail.all();

AuditEntry 结构

pub struct AuditEntry {
    pub id: String,                    // UUID
    pub process_id: String,            // 流程实例 ID
    pub node_id: Option<String>,       // 节点 ID
    pub level: AuditLevel,             // Info / Warning / Error / Critical
    pub category: String,              // "node_exec" / "gateway_route" / "compensation"
    pub message: String,               // 人类可读描述
    pub data: Option<serde_json::Value>,  // 附加结构化数据
    pub timestamp: DateTime<Utc>,
    pub duration_ms: Option<u64>,      // 执行耗时
}

SlaTracker — SLA 追踪

`SlaTracker` 基于流程定义的 SLA 截止时间追踪节点和流程级别的时效性。

use rust_agent_workflow_pro::{SlaTracker, SlaDeadline, SlaStatus};

let tracker = SlaTracker::new(vec![
    SlaDeadline::new("overall", Duration::from_secs(60)),
    SlaDeadline::new("validation", Duration::from_secs(10))
        .for_node("validate_order"),
]);

// 启动所有 SLA 计时
tracker.start_all();

// 定期检查
let statuses: Vec<(String, SlaStatus)> = tracker.check_all();
for (name, status) in &statuses {
    println!("{} → {:?}", name, status);
}

// 单项完成
tracker.complete("validation");

// 查看剩余时间
let remaining = tracker.remaining("overall");  // → Some(Duration)

状态演进

Pending → OnTrack → AtRisk (>80% 已用) → Breached (超时)
                                              ↓
                                            Met (在 SLA 内完成)

违约回调

tracker.on_breach(|deadline_name: &str| {
    // 发送告警、触发升级等
    tracing::warn!("SLA breached: {}", deadline_name);
});

ProcessMetricsCollector — 指标采集

收集流程实例的执行指标,包括节点数、完成数、失败数、重试数和耗时。

use rust_agent_workflow_pro::ProcessMetricsCollector;

let collector = ProcessMetricsCollector::new();

// 注册流程
collector.register("proc-1");

// 记录节点事件
collector.node_started("proc-1", "node-a");
collector.node_completed("proc-1", "node-a", Duration::from_millis(120));
collector.node_failed("proc-1", "node-b");
collector.node_retried("proc-1");

// 完工
collector.process_completed("proc-1");

// 查询
let metrics = collector.get("proc-1").unwrap();
println!("成功率: {:.1}%", metrics.success_rate() * 100.0);
println!("总耗时: {}ms", metrics.duration_ms());