2. Agent 架构概览:标准日志检索准入门禁 Agent 的模块组成
一个标准的日志检索准入门禁 Agent,其核心职责是:接收用户查询请求,解析意图,检索日志存储系统,过滤结果,并最终做出“准入”或“拒绝”的决策。为了在资源受限的环境下高效运行,该 Agent 被拆解为五个职责清晰的模块,形成一条完整的处理流水线。
架构设计原则: 模块间通过轻量级上下文对象传递数据,避免共享状态;每个模块均可独立进行资源消耗监控与优化,便于后续性能调优。
2.1 模块组成与职责
下表列出了五个核心模块及其在资源消耗优化中的关键关注点:
| 模块名称 | 核心职责 | 资源消耗关键点 |
|---|---|---|
| 输入解析 | 接收原始查询文本,进行分词、实体识别、意图分类 | NLP 模型推理耗时、内存占用(大词表加载) |
| 策略引擎 | 加载并匹配用户权限策略、时间窗口、频次限制 | 策略规则数量、规则匹配算法复杂度、缓存命中率 |
| 日志检索 | 根据解析后的查询条件,向后端存储(如 Elasticsearch)发起检索 | 网络 I/O 延迟、检索返回数据量、连接池管理 |
| 结果过滤 | 对检索返回的原始日志进行字段裁剪、敏感信息脱敏、排序截断 | 数据遍历次数、正则/替换操作 CPU 开销、内存分配频率 |
| 准入决策 | 综合策略引擎判定与过滤后的结果,输出最终准入/拒绝结果 | 决策逻辑分支数、结果序列化开销 |
2.2 模块间数据流与协作关系
下图展示了五个模块之间的典型调用顺序与数据传递路径。箭头方向代表请求处理的主流程,虚线代表策略引擎对后续模块的约束反馈。
2.3 模块交互的典型时序
为了更清晰地展示模块间的协作顺序,以下是一个典型的请求处理时序步骤:
- 输入解析:接收用户查询“查询今天 10:00-11:00 的登录失败日志”,输出结构化查询条件
{timeRange: [10:00, 11:00], eventType: login_failure}。 - 策略引擎:并行检查用户是否具有该时间段的查询权限,以及是否超过每分钟 5 次的频次限制。
- 日志检索:根据结构化条件向后端发起检索,返回原始日志列表(可能包含敏感 IP、用户名等字段)。
- 结果过滤:对原始日志进行字段裁剪(仅保留时间、事件类型、源 IP 前三段),并对 IP 进行脱敏处理。
- 准入决策:综合策略引擎的“允许”判定与过滤后的结果,输出最终准入响应。
优化切入点提示: 在实际资源消耗优化中,输入解析与结果过滤是 CPU 密集型模块,日志检索是 I/O 密集型模块,策略引擎则对缓存设计高度敏感。后续章节将针对每个模块逐一展开优化策略。
2.4 模块化设计的资源隔离优势
将 Agent 拆分为独立模块,除了逻辑清晰外,在资源优化方面带来以下具体收益:
- 独立扩缩容:当日志检索成为瓶颈时,可单独增加该模块的并发实例,而不影响其他模块。
- 细粒度监控:每个模块可独立采集 CPU 耗时、内存分配、GC 压力等指标,精准定位热点。
- 局部降级:当策略引擎依赖的外部服务超时时,可快速返回默认策略(如“拒绝”),避免整个 Agent 阻塞。
- 缓存隔离:不同模块使用独立的缓存空间,避免大对象缓存污染其他模块的内存区域。
下图展示了模块化带来的资源监控与隔离效果:
2.5 架构设计的资源消耗基线
在后续章节进行具体优化之前,我们需要先建立当前架构的资源消耗基线。以下是一个典型单次请求的模块耗时分布示例:
| 模块 | 平均耗时 (ms) | P99 耗时 (ms) | 内存分配 (KB) | 优化优先级 |
|---|---|---|---|---|
| 输入解析 | 45 | 120 | 512 | 高 |
| 策略引擎 | 8 | 30 | 128 | 中 |
| 日志检索 | 120 | 500 | 2048 | 最高 |
| 结果过滤 | 32 | 85 | 384 | 高 |
| 准入决策 | 3 | 10 | 64 | 低 |
注意: 以上基线数据来自典型生产环境采样,实际数值会因日志量大小、策略规则复杂度、后端存储性能等因素而波动。在后续优化实践中,我们将以该基线为参照,衡量每次优化带来的实际收益。