☰
Apigee Hybrid存储架构解析:Redis与Cassandra的分工与协作
2026/10/16 4:03:21 网站建设 项目流程

第一次把一个带 Apigee Hybrid 的集群完整看下来,绝大多数人都会对部署清单里的两个存储组件留下深刻印象:一个是 Cassandra,另一个是 Redis。它们在清单里挨得很近,但坦白讲,很多刚接触这套架构的人并不清楚,它们到底为什么必须同时存在,各自又在数据链路里扮演什么角色。R共享缓存、分布式锁、短期热点数据,另一侧是持久化配置、配额计数、分析事件——如果没有清晰的边界意识,很容易把 Redis 当万能加速器用,或者反过来让 Cassandra 扛住所有高频访问,最后两头都出问题。

这篇文章我会从混合架构的存储需求讲起,拆开 Redis 与 Cassandra 在 Apigee Hybrid 里的精确分工,并补充部署和调优阶段容易踩的坑。适合正在上手 Apigee Hybrid、或者准备设计混合 API 网关存储方案的团队参考。

1. 混合架构带来的存储现实:为什么同时需要 Redis 和数据库

1.1 控制面与数据面分离后的数据落点

Apigee Hybrid 的核心形态,是把原本托管在云端的控制能力,与运行在客户集群里的数据面组件分开。控制面负责管理配置、发布 API 代理、聚合分析;数据面负责真正的 API 流量处理。这带来的一个直接结果是:数据面处理请求时,不能再依赖远端的控制面来提供每一个运行决策所需的数据。

纯 SaaS 模式下,配置和运行时数据都在托管环境内部,网络开销被抹平了。但混合模式下,每一次 API 调用都可能来自你的数据中心、你的 Kubernetes 节点,如果每一步都要跨网络去查远端配置,延迟和可用性都会变得很难看。所以 Apigee Hybrid 在数据面一侧也部署了自己的存储组件——Cassandra 和 Redis。它们共同支撑起整个数据面的运行闭环。

1.2 “本地闭环”对缓存与持久化提出的不同要求

数据面要在本地闭环,意味着两件事必须要同时满足。

第一,关键配置和业务数据不能丢。比如 API 代理的修订版本、开发者应用与 API 产品的绑定关系、配额计数的权威记录,这些一旦丢失,整个网关的治理能力就等于瘫痪了。这类数据需要一个真正具备持久化能力、支持分布式复制的数据源,这就是 Cassandra 进入架构的原因。

第二,高频访问路径上不能每次都要查盘。API Key 校验、令牌校验、热点响应数据读取,这些都是每个请求必经的路径。如果每次都打到 Cassandra 上,吞吐会被磁盘 IO 和网络往返卡死。需要有东西把这些热点数据放在内存里,以极低的延迟提供服务,这就是 Redis 的用武之地。

很多人在最初接触这套架构时会有一个错觉:觉得 Redis 和 Cassandra 是"两个数据库,选一个用"。但实际上,它们的定位完全不同。Redis 的内存模型决定了它无法成为持久化权威源,而 Cassandra 的分布式和落盘特性又决定了它不适合承载毫秒级高并发缓存。两者之间是互补关系,不是替代关系。

2. 持久化核心:Cassandra 在这场架构里负责什么

2.1 为什么选型落在 Cassandra 而不是传统关系库

很长一段时间里,团队在讨论 Apigee Hybrid 的数据库选型时,都会下意识问一句:为什么不直接用 MySQL 或者 PostgreSQL?这个问题的答案,藏在数据特征里。

Apigee 数据面存储的数据,更像分布式系统中的"配置 + 事件流 + 计数器",而不是典型的财务级关系型事务数据。配置数据虽然存在实体关联,但读取频率远高于写入;分析数据是典型的追加写场景,按时间维度持续增长;配额计数则强调"分布式环境下并发扣减不超卖"。这些特征指向一条共性要求:横向扩展要容易,写入吞吐要够高,还要能跨节点复制。

Cassandra 的 LSM 存储结构对高吞吐写入非常友好,同时通过分区键把数据打散到多个节点,扩展能力比集中式主从结构强得多。再加上它的无主复制模型,不像传统主从那样需要一个核心 Master 节点承担所有压力。这些都是 Apigee 选择 Cassandra 作为持久化核心的现实考量。基于我部署过的配置,默认会起多个 Cassandra 副本做支撑,而不是一个单点实例。

2.2 配置、运行与分析:Cassandra 中的三类关键数据

从我的实测经验来看,Cassandra 在 Apigee Hybrid 里承担的数据可以粗略分成三类:

  • 配置数据:包括组织、环境、API 代理、API 产品、开发者应用、目标服务器、密钥库元数据、KVM(键值映射)等。这些数据由 Synchronizer 组件从控制面周期性地拉取,然后写入本地 Cassandra。运行时组件读取这些配置来决定"这个请求应该走哪条路由、要不要校验 Key、配额是多少"。
  • 运行时状态数据:包括 OAuth 令牌的权威状态、消费方的访问上下文、分布式配额计数器的持久化部分。这类数据虽然写入频率不如分析数据高,但对一致性要求严格。
  • 分析数据:每个 API 请求的访问记录、延迟指标、目标响应时间、错误码、流量大小等。这些数据由运行时组件生成,经过数据面内部的采集通道异步写入 Cassandra,用于后续的可视化分析和问题排查。

这三类数据的共同点是:丢失不可接受,或者重建成本实在太高。配置改动了就要长期保留,分析事件一旦丢弃就无法重放。所以它们必须落在 Cassandra 里,而不是交给容易丢数据的缓存层。

2.3 一次请求在 Cassandra 路径上留下的痕迹

用一个最简单的请求流程来理解 Cassandra 在链路中的存在感。

当一个带 API Key 的请求到达运行时组件,网关需要确认这个 Key 是否有效、归属于哪个开发者应用、绑定的是哪个 API 产品。这些绑定关系的权威数据源就在 Cassandra。即使某个环节用了缓存,最终还是要回到 Cassandra 去校验和获取。

接着,如果 API 代理上挂了配额策略,配额计数器需要在 Cassandra 里做持久化的扣减记录。这里我补充一个细节:Apigee 的分布式配额机制会利用 Cassandra 的原子计数能力来保证跨多个运行时节点的扣减不超限。请求处理完成后,异步分析链路会把本次调用的日志、延迟、状态码等数据发给采集组件,最终批量写入 Cassandra。

这些过程对调用方是透明的,但底层 Cassandra 承载了非常大的读写压力。理解这条路径,对后续做容量评估和故障排查很有帮助。

3. 缓存层 Redis 的真实职责:远不止 key-value 缓存

如果说 Cassandra 是数据面的"账本",Redis 就是数据面的"便利贴+操作台"。很多人一看到 Redis 就简单把它理解成缓存,但在 Apigee Hybrid 里,Redis 的职责其实更立体。

3.1 热校验数据的短期缓存

API Key 和 OAuth 令牌的校验是每个请求的必经路径。如果每个请求都去 Cassandra 校验,先不说延迟会不稳定,光是 Cassandra 的读压力就会非常大。在我维护的集群里,这里一个很自然的优化就是用 Redis 做短期缓存:把最近校验通过的令牌、Key 的到期时间和吊销状态先放到 Redis 里,相同凭证的后续请求直接在内存里完成校验。

缓存 TTL 的设计很关键。TTL 不能比凭证的实际有效期长,否则吊销操作无法及时生效;TTL 太短又会让缓存形同虚设。实际操作中,我会把 TTL 设定在凭证有效期和吊销容忍时间之间取一个平衡值,比如访问令牌有效期是 30 分钟,Redis 缓存 TTL 设在 5~10 分钟比较常见。这样既不会频繁穿透到底层数据库,又能比较快地感知到吊销状态变更。

3.2 分布式锁与并发配额扣减

配额管理是 API 治理里最典型的"并发写冲突"场景。多个运行时实例同时处理同一个消费者的请求时,如果每个实例都维护一个本地计数器,最终合计起来必然不准。Apigee 的分布式配额机制解决这个问题的思路,是让 Redis 承担跨实例协调者的角色。

具体来说,运行时节点对配额计数进行扣减前,会通过 Redis 的原子操作或分布式锁机制,保证同一时刻只有特定节点在更新某条计数。Redis 的 INCR 这类命令天然具备原子性,非常适合做这种高频小步更新;Cassandra 则负责在最后阶段记录权威计数。这样既能满足毫秒级的扣减响应,又能保证最终计数准确、可追溯。

我在实际测试中遇到过一个问题:如果只依赖 Redis 做计数而不落 Cassandra,一旦 Redis 重启或切换,计数就会丢。所以这里一定不能省掉 Cassandra 这层持久化,Redis 解决的是"并发操作的一致性",不是"数据的持久性"。

3.3 多副本与故障切换下的 Redis 安全性

Redis 在 Apigee Hybrid 的数据面里通常以多节点高可用方式部署,避免单点故障。但需要注意,Redis 的持久化能力天然弱于 Cassandra。即使开启了 RDB 或 AOF,故障切换时仍然可能丢失极短窗口内未持久化的写操作。

因此,架构设计上有一个不可动摇的原则:凡是放进 Redis 的数据,都必须是可以重建或者可以容忍丢失的。API Key 校验缓存丢了,下次请求穿透到 Cassandra 重新加载即可;分布式锁丢失,最多导致一次短暂的重试;但如果把配额计数的唯一记录放在 Redis 里,风险就不可接受了。

这也是我始终强调"精确分工"的原因。Redis 在这里的价值是"加速"和"协调",Cassandra 的价值是"记录"和"恢复"。两者配合,才能让整个系统既快又稳。

4. 分工边界:一份数据到底该进 Redis 还是 Cassandra

4.1 四个判断标准:持久性、一致性、访问模式与恢复成本

每次设计存储方案时,我都习惯用下面四个问题来判断一份数据应该放在哪里:

  • 持久性要求有多高?丢失数据是否等同于事故?如果是事故级,进 Cassandra;如果只是性能退化,进 Redis。
  • 一致性要求严格吗?是否要求所有节点在同一时刻看到完全相同的值?如果是,必须由 Cassandra 承担权威源,Redis 只做协调辅助;如果允许最终一致,Redis 缓存完全够用。
  • 访问模式是什么?高频的、小体积的热点读取适合 Redis;大范围的、按条件的扫描查询必须交给 Cassandra。
  • 数据能否从其他来源重建?能从配置中心或控制面重新拉取,就放心进 Redis;一旦丢了就再也找不回来,必须进 Cassandra。

用一个生活化的类比:Redis 是办公桌上那叠便利贴,上面写着"今天要联系的人电话";Cassandra 是公司档案室里的客户台账。便利贴被风刮走了,照着档案重新写一张就行;档案室烧了,那才叫灾难。

4.2 数据归属对照表与生命周期差异

为了让大家有一个直观的对照,我把常见数据类型的归属整理成表格:

数据类型权威存储缓存/辅助存储生命周期说明
组织/环境/API 代理配置CassandraRedis 可做配置快照缓存长期持久,变更频率低
开发者应用与 API 产品绑定CassandraRedis 可做短期校验缓存长期持久,变更频率低
KVM 键值映射CassandraRedis 可加速读取数据生命周期取决于配置更新
OAuth 令牌/API Key 校验结果Cassandra(权威状态)Redis(短期缓存+过期管理)秒级到分钟级,TTL 后失效
配额计数器Cassandra(最终记录)Redis(原子扣减+锁)按时间窗口滚动
API 调用分析事件Cassandra不经过 Redis持续累积,按保留期清理
分布式锁不持久化Redis操作完成后即释放

这个表格基本覆盖了 Apigee Hybrid 里最常见的数据流动场景。注意"OAuth 令牌/API Key"这类数据,它的权威状态在 Cassandra,但高频校验可以走 Redis,相当于一份数据在两个层面有不同的生命周期。

4.3 一致性级别的区别对待

Cassandra 和 Redis 在一致性上的设计哲学完全不同,这也是理解分工边界的关键。

Cassandra 提供一致性级别配置,比如写入时可以使用 LOCAL_QUORUM,保证大多数副本确认后才返回成功。读操作同样可以通过一致性级别避免读到旧数据。这种设计换来的是强一致性的可选择性,适合那些"读错一个值就出问题"的场景。

Redis 默认的主从复制是异步的,主节点写入成功即返回,从节点的复制在后台进行。这意味着故障切换的瞬间,可能丢失主节点最近一小段未复制的写操作。所以 Redis 适合的场景是"稍微旧一点的数据也能接受、而且很快会被覆盖"的场景。

在实际配置里,我会把这条原则放在最前面:凡是"扣减必须不超卖"、"状态必须最新"的,一定要让 Cassandra 参与最终裁决;凡是"丢了可重建、旧一点无妨"的,才适合交到 Redis 手里。这个边界想清楚了,很多架构争议都能迎刃而解。

5. 部署调优与运维踩坑:从配置到监控的实操经验

5.1 容量评估思路:Redis 按内存,Cassandra 按磁盘与吞吐

在做容量规划时,两个存储组件的评估思路是截然不同的。

Redis 是内存型存储,容量评估的核心是内存。我会根据并发请求量、每个校验对象的平均大小、缓存 TTL 和平均请求生命周期来估算峰值内存占用。举个例子:如果高峰期有 50 万活跃令牌,每个令牌关联的上下文大约 1KB,那么仅令牌缓存就需要约 500MB 内存;再加上 API Key 缓存、分布式锁占用和响应缓存,总内存需求还要再往上走。实际操作中,我会为 Redis 预留 30% 以上的余量,避免内存写满触发淘汰策略,进而影响核心缓存。

Cassandra 的评估重点则是磁盘增长速度和吞吐能力。分析数据是写入量的大头,需要按"每秒请求数 × 单条记录大小 × 保留天数"来估算磁盘占用。同时还要考虑 compaction 带来的临时空间、快照备份空间、以及节点故障时剩余节点的容量冗余。磁盘建议优先选择 SSD,因为 Cassandra 对 IO 延迟敏感,机械盘在高写入下很容易拖慢整个集群。

5.2 高可用部署与网络分区

Apigee Hybrid 里的 Cassandra 一般以多节点方式部署,常见起步是 3 个副本,并且希望跨可用区分布。复制因子设置为 3,读写一致性级别通常配置为 LOCAL_QUORUM。这样即使一小部分节点故障,区域内仍然有足够的副本响应请求。

Redis 的高可用建议选择哨兵模式或集群模式,同样以 3 个节点起步。不要把 Redis 部署成单节点,因为运行时所有实例都会共享这一层缓存,单点问题会在流量高峰时被无限放大。我遇到过一种情况是某次网络抖动导致 Redis 哨兵发生切换,期间部分短连接报错。分析后发现,业务侧缺少重试机制,导致故障时间被拉长了。这里要提醒一下:给数据面组件配好对 Redis 的重试和超时控制,是必做功课。

5.3 监控指标与巡检建议

存储层的健康程度,直接影响整个网关的稳定性。我的监控清单里至少会覆盖以下内容:

组件关键指标重点关注
Cassandra堆内存使用、GC 暂停时间老年代增长、Full GC 频率
Cassandra读写延迟、Pending 任务数是否存在请求堆积
CassandraCompaction 压力和磁盘空间预留足够临时空间
Redis内存使用率、键数量是否接近 maxmemory 限制
Redis命中率、操作延迟、连接数缓存是否在发挥价值
Redis持久化成功状态、主从复制延迟故障切换是否会丢数据

巡检频率上,建议至少每周做一次系统级检查,重点观察慢查询日志、节点间网络延迟、以及 GC 指标。很多看起来无解的网关超时问题,最后都能定位到 Cassandra 的一次长时间 Full GC 或 Redis 的一个大 Key 扫描。

6. 一条 API 请求的完整存储旅程

6.1 阶段一:建立连接与身份校验

梳理完整请求链路,比单独看组件更能理解"分工"的意义。

客户端带着访问令牌调用 API。运行时组件收到请求后,第一步是确认令牌是否有效。这个过程中,Redis 先被查询——如果近期校验过且未过期,直接命中缓存,流程继续;如果没有命中,运行时再去 Cassandra 读取令牌的权威状态,并在读取后把结果回填到 Redis。

这个阶段 Redis 的价值是"降低时延、减少底层压力",Cassandra 的价值是"恢复到可用状态时还能找到真实依据"。如果 Redis 缓存被清空,系统不会死掉,只是重新经历一段冷启动时间。

6.2 阶段二:配额扣减中的协作

请求进入正式处理流程时,如果 API 代理上配置了配额策略,存储层会展开一次紧密的协同操作。运行时先在 Redis 里执行原子计数更新或获取分布锁,以极快速度判断当前时间窗口内是否已经超过限额。如果超过,直接拒绝请求并返回配额错误;如果没有超过,则允许请求继续,并把最终计数结果写入 Cassandra 作为权威记录。

这个流程的精妙之处在于,高并发的扣减操作主体在 Redis 完成,避免了所有请求积压到 Cassandra;但权威数据的落点仍然在 Cassandra,即使 Redis 崩溃重启,已经扣除的配额依然有案可查,不会出现"重启后配额清零"的事故。

6.3 阶段三:响应缓存与分析事件落库

请求处理完成后,如果目标 API 返回的结果是允许缓存的类型,运行时可能把响应内容写入 Redis,并设置一个合理的 TTL。后续相同请求可以在网关层直接返回命中结果,大幅减轻后端服务的压力。

与此同时,分析链路照常工作。每次调用的请求时间、响应码、延迟、目标主机等数据会被打包发送给采集组件,再批量写入 Cassandra。这里有一个有意思的设计:响应走 Redis 追求的是"快",分析走 Cassandra 追求的是"事后可见"。两条路径并行不悖,恰好体现了两个存储组件的分工。

6.4 故障场景下的存储行为

最后说一种大家最关心的场景:故障时系统会怎样表现。

如果 Cassandra 短暂不可用,配置读取和配额记录可能失败,运行时通常会上报错误状态或返回 503,需要明确的是,这属于正确的失败行为,因为没有权威数据时放行请求反而更危险。如果 Redis 不可用,情况会缓和一些:校验请求会穿透到 Cassandra,流量仍然能够运转,只是延迟会明显上升。Redis 恢复后,缓存重新预热,系统逐渐回到高性能状态。

预先理解这些故障行为,对运维排障非常重要。我曾经遇到网关整体变慢、但没有明显错误日志的情况,最后排查是 Redis 内存不足触发了淘汰,热点 Key 频繁被驱逐,大量请求穿透到 Cassandra 导致底层压力陡增。可见,看似简单的存储分工,一旦某个环节配置失当,整个数据面都会跟着受牵连。

在我维护这套架构的过程中,最深刻的一个体会是:不要把存储层当成数据面的"辅助零件"。Cassandra 负责稳,Redis 负责快,两者之间的边界一旦模糊,故障会以很隐蔽的方式出现。最后分享一个实用习惯:每次变更 Cassandra 的一致性级别或 Redis 的内存策略之前,先记录好当前配置和基线指标,变更后对比数据。很多时候,问题不是出在功能上,而是出在没有对比就没有发现。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询