如何在 Apigee X 中缓存部分响应或特定元素?
Source: Dev.to
抱歉,我无法直接访问外部链接的内容。如果您能提供需要翻译的具体文本,我很乐意帮您将其翻译成简体中文,并保持原有的格式、Markdown 语法以及技术术语不变。
介绍
想象一下,你正在为一个电子商务应用构建 API。每当用户打开商品页面时,后端会重新计算 商品详情、定价 和 针对用户的优惠。
- 商品详情 很少变化。
- 优惠 变化频繁。
如果只缓存 整个 响应,而实际上只有其中的一部分是可复用的,这不是很浪费吗?
这正是 Apigee X 中的部分响应缓存 显得极其强大的地方。
在现代 API 管理 中,性能和可扩展性至关重要。Apigee X 让你不仅可以缓存完整的 API 响应,还可以缓存 响应的特定元素或片段。这样可以降低后端负载,提升延迟表现,并且让你对哪些内容应该缓存、哪些不应该缓存拥有细粒度的控制。
在本指南中,你将学习:
- 什么是 Apigee X 中的部分响应缓存
- 何时以及为何使用它
- 面向初学者的逐步实现方法
- 最佳实践以及常见错误的避免方法
核心概念
什么是 Apigee X 中的响应缓存?
在 Apigee X 中,API 代理位于客户端和后端服务之间。这些代理的一个强大功能是响应缓存,它会临时存储 API 响应,以便对重复请求能够更快地返回。
默认情况下,缓存常被视为*“缓存所有内容”。*然而,实际的 API 往往并非如此简单。
什么是部分响应缓存?
部分响应缓存指的是仅缓存响应的特定部分,而不是完整的负载。
类比: 想象一家餐厅的菜单。
- 菜单项很少变化 → 缓存它们。
- 每日特价经常变化 → 不缓存它们。
与其每次都存储整份菜单,你只缓存静态部分,然后动态组装最终的响应。
为什么缓存部分响应?
使用场景和好处
- 减少对静态数据的后端调用
- 提升 API 响应时间
- 避免提供过时的动态数据
- 优化缓存大小和效率
- 更好地控制 API 流量管理
Apigee X 中的典型场景:
- 用户资料 API
- 产品目录
- 配置或参考数据
- 静态 + 动态混合响应
步骤指南:Apigee X 中的部分响应缓存
场景
后端响应
{
"userId": "123",
"name": "Ravi",
"accountType": "PREMIUM",
"balance": 8450.75,
"lastLogin": "2025-12-15T10:30:00Z"
}
| 字段 | 更改频率 | 缓存? |
|---|---|---|
accountType | 很少 | ✅ |
balance | 频繁 | ❌ |
lastLogin | 频繁 | ❌ |
第 1 步 – 提取可缓存元素
使用 ExtractVariables 策略提取静态部分。
<ExtractVariables name="ExtractAccountType">
<JSONPayload>
<Variable name="accountType">$.accountType</Variable>
</JSONPayload>
</ExtractVariables>
📌 这会把
accountType提取到流变量(accountType)中。
第 2 步 – 缓存部分值
使用 ResponseCache 策略仅缓存提取的元素。
<ResponseCache name="CacheAccountType">
<CacheKey>
<KeyFragment ref="accountType"/>
</CacheKey>
<Scope>Exclusive</Scope>
<ExpirySettings>
<TimeoutInSec>3600</TimeoutInSec>
</ExpirySettings>
<CacheResource>accountType</CacheResource>
</ResponseCache>
📌 只缓存
accountType的值,而不是完整响应。
第 3 步 – 使用缓存数据填充响应
在返回响应之前,使用 AssignMessage 注入缓存值。
<AssignMessage name="BuildHybridResponse">
<Payload contentType="application/json">
{
"userId": "{request.header.user-id}",
"accountType": "{accountType}",
"balance": "{response.balance}",
"lastLogin": "{response.lastLogin}"
}
</Payload>
<AssignTo createNew="true" transport="http" type="response"/>
</AssignMessage>
📌 这会创建一个 混合响应:部分来自缓存,部分为动态生成。
流程图(概念)
Client
|
v
Apigee X API Proxy
|
|-- 检查 accountType 缓存
|
|-- 调用后端获取动态数据
|
|-- 合并缓存值和动态值
|
v
Final Response to Client
最佳实践
- 仅缓存真正静态的数据 – 避免用户特定或频繁变化的字段。
- 设计有意义的缓存键 – 使用用户 ID、地区或产品 ID 等标识符。
- 设置合适的 TTL 值 – 对半静态数据使用短 TTL,对参考数据使用更长 TTL。
- 绝不缓存敏感信息 – 不缓存个人身份信息(PII)、令牌或机密数据。
- 监控缓存性能 – 使用 Apigee 分析来跟踪命中/未命中比例。
常见错误避免
| ❌ 错误 | 为什么是问题 |
|---|---|
| 在仅有部分可复用时缓存完整响应 | 浪费缓存空间并可能提供过期数据 |
| 为不同用户使用相同的缓存键 | 导致用户之间的数据泄漏 |
| 忽视缓存失效策略 | 过期数据会比预期存留更久 |
| 未在负载下测试缓存行为 | 出现意外的性能瓶颈 |
结论
在 Apigee X 中进行部分响应缓存可以让您对性能优化进行细粒度控制。通过仅缓存 有意义的内容,您可以实现更快的 API 响应、降低后端负载,并提升消费者的满意度。
结合 ExtractVariables、ResponseCache 和 AssignMessage 策略,您可以:
- 提取静态片段。
- 高效地存储它们。
- 在每次请求时重新组装出混合响应。
祝缓存愉快! 🚀
在速度与新鲜度之间取得平衡的智能 API 代理
设计能够在速度与新鲜度之间取得平衡的智能 API 代理。这种方法在数据以不同速率变化的真实企业 API 中尤为有价值。
既然您已经了解了概念,请尝试在您的某个 API 中实现部分响应缓存,并亲自观察性能提升的效果。